[ios]事件委托

发布时间: 2017/3/21 22:57:30
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有两个 uiviewcontroller : MainViewControllerSecondaryViewControlle 。在 MainViewController 我做︰

[self.view addSubView:SecondaryViewControlle.view];

SecondaryViewController是一个按钮按函数执行的 MainViewController 。怎么办?

解决方法 1:

选项 A
它是更快速、 更容易,但缺乏可维护性,因为没有合同说明 SecondaryViewController 需要不厌其烦地调用任何东西,和 self.parentViewController 可能是任何 UIViewController。

选项 B
委托模式;这是我的偏好,很明显发生了什么,需要什么,还有很好的固体合同国家,如果你想要初始化我,给我一个委托。

选项 C
如果 SecondaryViewController 通知多个对象,它就会马上使用 NSNotificationCenter,但由于与选项 A,有没有合同,您需要通知许多对象,您需要记住要侦听这些对象-的通知,因为这不是问题,就不再赘述,只是这里的信息

选项 A
在 MainViewController.m 内, 做一些事情就像这样︰

SecondaryViewController *viewcontroller = [[SecondaryViewController alloc] initWithNibName:@"SecondaryView" bundle:nil];
[self addChildViewController:viewcontroller];

//set viewcontroller.view frame

[self.view addSubview:viewcontroller.view];

[viewcontroller didMoveToParentViewController:self];

里面的 MainViewController.h

-(void) performButtonClickAction;

里面的 MainViewController.m:

-(void) performButtonClickAction {
    //Do something constructive
}

然后里面的 SecondaryViewController.m:

-(IBAction) buttonPressed:(id) sender {
    [self.parentViewController performButtonClickAction];
}

选项 B
里面的 SecondaryViewController.h

@protocol SecondaryViewControllerDelegate <NSObject>
-(void) eventAFromViewController:(UIViewController *) viewController;
-(void) eventBFromViewController:(UIViewController *) viewController;
@end

@interface SecondaryViewController : UIViewController {
    id<SecondaryViewControllerDelegate> delegate;
}

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

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil delegate:(id<SecondaryViewControllerDelegate>) theDelegate;
@end

内部 SecondaryViewController.m @synthesize 委托 = _delegate;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil delegate:(id<SecondaryViewControllerDelegate>) theDelegate
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.delegate = theDelegate;
    }
    return self;
}

-(IBAction) buttonPressed:(id) sender {
    if( self.delegate != nil ) {
        [_delegate eventAFromViewController:self];
    }
    else {
        //No delegate
    }
}
官方微信
官方QQ群
31647020