cdts/xdts-ios 3/TreeHole/Code/Utility/ImagePicker/BlocksKit/DynamicDelegate/NSObject+A2BlockDelegate.h

122 lines
4.7 KiB
C
Raw Normal View History

2023-07-27 09:20:00 +08:00
//
// NSObject+A2BlockDelegate.h
// BlocksKit
//
#import "BKDefines.h"
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/** The A2BlockDelegate category extends features provided by A2DynamicDelegate
to create custom block properties in a category on a delegating object and
dynamically map them to delegate (`UIAlertViewDelegate`), data source
(`UITableViewDataSource`), or other delegated protocol
(`NSErrorRecoveryAttempting`) methods.
A2BlockDelegate also supports replacing the delegate of a given class with an
automatic - though optional - version of these block-based properties, while
still allowing for traditional method-based delegate implementations.
Simply call one of the methods in the category on a class to add a block
property to that class, preferably during a `+load` method in a category.
To interplay between classes that support delegation but are extended to have
block properties through delegate replacement extended to have block
properties, one should implement an `A2Dynamic<ProtocolName>` subclass of
`A2DynamicDelegate`. This behavior is documented in detail in the class
documentation for A2DynamicDelegate, and examples exist in BlocksKit.
*/
@interface NSObject (A2BlockDelegate)
/** @name Linking Block Properties */
/** Synthesizes multiple properties and links them to the appropriate selector
in the data source protocol.
A2DynamicDelegate assumes a protocol name `FooBarDataSource` for instances of
class `FooBar`. The method will generate appropriate `setHandler:` and
`handler` implementations for each property name and selector name string pair.
@param selectorsForPropertyNames A dictionary with property names as keys and
selector strings as objects.
*/
+ (void)bk_linkDataSourceMethods:(NSDictionary *)selectorsForPropertyNames;
/** Synthesizes multiple properties and links them to the appropriate selector
in the delegate protocol.
A2DynamicDelegate assumes a protocol name `FooBarDelegate` for instances of
class `FooBar`. The method will generate appropriate `setHandler:` and
`handler` implementations for each property name and selector name string pair.
@param selectorsForPropertyNames A dictionary with property names as keys and
selectors strings as objects.
*/
+ (void)bk_linkDelegateMethods:(NSDictionary *)selectorsForPropertyNames;
/** Synthesizes multiple properties and links them to the appropriate selector
in the given protocol.
The method will generate appropriate `setHandler:` and `handler`
implementations for each property name and selector name string pair.
@param protocol A protocol that declares all of the given selectors. Must not
be NULL.
@param selectorsForPropertyNames A dictionary with property names as keys and
selector strings as objects.
*/
+ (void)bk_linkProtocol:(Protocol *)protocol methods:(NSDictionary *)selectorsForPropertyNames;
/** @name Delegate replacement properties */
/** Registers a dynamic data source replacement using the property name
`dataSource` and the protocol name `FooBarDataSource` for an instance of
`FooBar`. */
+ (void)bk_registerDynamicDataSource;
/** Registers a dynamic delegate replacement using the property name `delegate`
and the protocol name `FooBarDelegate` for an instance of `FooBar`. */
+ (void)bk_registerDynamicDelegate;
/** Registers a dynamic data source replacement using the given property name
and the protocol name `FooBarDataSource` for an instance of `FooBar`.
@param dataSourceName The name of the class' data source property. Must not be
nil.
*/
+ (void)bk_registerDynamicDataSourceNamed:(NSString *)dataSourceName;
/** Registers a dynamic delegate replacement using the given property name and
the protocol name `FooBarDelegate` for an instance of `FooBar`.
@param delegateName The name of the class' delegate property. Must not be nil.
*/
+ (void)bk_registerDynamicDelegateNamed:(NSString *)delegateName;
/** Registers a dynamic protocol implementation replacement
using the given property name and the given protocol.
@param delegateName The name of the class' delegation protocol property, such
as `safeDelegate`. Must not be nil.
@param protocol A properly encoded protocol. Must not be NULL.
*/
+ (void)bk_registerDynamicDelegateNamed:(NSString *)delegateName forProtocol:(Protocol *)protocol;
/** Creates or gets a dynamic delegate, assuring that it is the delegate.
@see bk_dynamicDelegate:
@return A dynamic delegate.
*/
@property (NS_NONATOMIC_IOSONLY, readonly, strong) id bk_ensuredDynamicDelegate;
/** Creates or gets a dynamic protocol implementation, assuring that it is
assigned to the delegate property correspending to that protocol
@see bk_dynamicDelegateForProtocol:
@return A dynamic delegate.
*/
- (id)bk_ensuredDynamicDelegateForProtocol:(Protocol *)protocol;
@end
NS_ASSUME_NONNULL_END