【问题标题】:Handing off delegate via Segue - bad pattern?通过 Segue 移交代表 - 模式不好?
【发布时间】:2015-07-21 11:18:46
【问题描述】:
我有一些运行良好的 Obj-c 代码,但我想知道它是否使用了“反模式”,以及是否有明显更好的路线可供更有经验的人采用。
- ViewController1 充当从第三方库实例化的对象的委托。它在前台。
- ViewController2 即将进入前台。在 segue 中,在
prepareForSegue 中,ViewController1 将其当前作为委托的对象的委托设置为 ViewController2,以便在 ViewController2 处于前台时在 ViewController2 上接收任何后续委托调用。
这行得通。它并没有让我太困扰。但这感觉像是可能有更惯用的解决方案。
【问题讨论】:
标签:
ios
objective-c
iphone
delegates
【解决方案1】:
我不知道它是否适合您的情况,但是,如何制作一个为您管理委托内容的超级视图控制器,并让您的 ViewController1 和 ViewController2 成为它的子类?我会给你一个使用伪代码的例子。
你的 super_view_controller.m
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
//your delegate stuff, supposing the 3rd party lib object is singleton
[[3PARTYOBJ sharedInstance] setDelegate:self];
}
- (void)someDelegateMethod {
//common stuff
}
此时,如果您的 view_controller1 和 view_controller2 继承自 super_view_controller 类,您无需担心更改委托所有者,它会自动发生...如果您需要在 view_controller1 或 2 上做单独的事情,只需覆盖委托方法:
view_controller1.m(super_view_controller 子类)
- (void)someDelegateMethod {
//if you need common stuff, call super
//[super someDelegateMethod];
//or do your view_controller1 stuff here
}
(如果没有必要,您不需要覆盖view_controller2 上的委托方法。将调用super 方法)
【解决方案2】:
当您将 ViewController1 呈现/推送到 ViewController2 时,只需将对象的委托更改为 ViewController2。就像传递变量一样传递你的委托。
例如:
如果您使用故事板转场
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:SEGUE_IDENTIFIER]) {
ViewController2 *vc=(ViewController2 *)[segue destinationViewController];
vc.OBJECT_IN_VIEWCONTROLLER1=OBJECT_IN_VIEWCONTROLLER2;
vc.OBJECT_IN_VIEWCONTROLLER2.delegate=vc;
}
}
同时在 ViewController2 中设置 Object 类及其委托方法