委托 - 如何使用?(Delegate - How to Use?)

2019-06-25 19:47发布

我想我明白了一个委托背后的逻辑。 我得到了更多的使用它的问题。 多少个步骤组成? 我一定要利用现有的代表? 或者,我可以用我的一个人?

在我的例子我创建了许多同一类型的视图(对象/视图控制器)的AppDelegate中。 每个视图应该以某种方式呼吁AppDelegate中的方法来关闭本身。 当视图中的按钮按下时会发生这种事。 方法调用将包括视图(个体)的参考。

到目前为止,我知道,从其他语言的反应,事件侦听器等。 他们是如此的简单易用。

有谁能够帮我。 我只是发现了大量实例,在网络大量的代码。 它不能那么难只是调用父的目的C.

Answer 1:

我想你应该使用这个NSNotificationCenter

在你AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
...
...
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(buttonPushed:) name:@"ButtonPushedNotification" object:nil];
}

- (void)applicationWillTerminate:(UIApplication *)application
{
...
...
[[NSNotificationCenter defaultCenter] removeObserver:self];
}

这是选择时通报情况它会被称为(我们仍然在AppDelegate.m)

- (void)buttonPushed:(NSNotification *)notification {
NSLog(@"the button pushed...");
}

而在ViewController.m时按下的按钮(在方法内),你应该张贴这样的通知:

{
...
[[NSNotificationCenter defaultCenter] postNotificationName:@"ButtonPushedNotification" object:nil];
...
}


Answer 2:

你可以创建自己的:

在MyView1.h:

@class MyView1;

@protocol MyView1Delegate <NSObject>

- (void)closeMyView1:(MyView1 *)myView1;

@end

@interface MyView1 : NSObject
{
    id<MyView1Delegate> _delegate;
}

@property (assign, nonatomic, readwrite) id<MyView1Delegate> delegate;

...

@end

在MyView1.m:

@interface MyView1

@synthesize delegate = _delegate;

...

// The method that tells the delegate to close me
- (void)closeMe
{
    ....
    if ([_delegate respondsToSelector:@selector(closeMyView1:)])
    {
        [_delegate closeMyView1:self];
    }
}

@end

在AppDelegate.h:

#import "MyView1.h"

@interface AppDelegate <MyView1Delegate>
{
    MyView1 *_myView1;
}

...

@end

在AppDelegate.m:

- (void)someCreateViewMethod
{
    _myView1 = [[MyView1 alloc] initWithFrame:NSMakeRect(0, 0, 100, 200)];
    [_myView1 setDelegate:self];
    ...
}


Answer 3:

一个简单的方法来得到你想要的是只是一个视图启动。 然后,具有相互视图可以模态呈现。 当在视图中的按钮被按下做

[self dismissModalViewControllerAnimated:YES];

而且这里的东西我刚才做的时候我开始iPhone开发,可以帮助您与代表

Delegates

//In parent .m file:
//assign the delegate
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([segue.identifier isEqualToString:@"segueName"])
    {
        childController *foo = segue.destinationViewController;
        foo.delegate = self;
    }

}

//implement protocol method(s):
- (void) methodName:(dataType*) dataName
{
    //An example of what you could do if your data was an NSDate
    buttonLabel.titleLabel.text = [[date description] substringToIndex:10];
}

//In parent .h file:
//import child header
#import "ChildName.h"

//indicate conformity with protocol
@interface ParentName : UIViewController <ChildNameDelegate>

//In child .h file
//declare protocol
@protocol ChildNameDelegate
- (void) methodName:(dataType*) dataName;
@end

//declare delegate
@property (unsafe_unretained, nonatomic) id<ChildNameDelegate> delegate;


//In child .m file
//synthesize delegate
@synthesize delegate; 

//use method
- (IBAction)actionName:(id)sender 
{
    [delegate methodName:assignedData];
}


文章来源: Delegate - How to Use?