我有一些Obj-c代码工作正常,但我想知道它是否使用了“反模式”,如果有一个明显更好的路线,更有经验的人可能会采取。
prepareForSegue
中,ViewController1设置当前作为ViewController2的委托的对象的委托,以便在ViewController2处于前台时接收任何后续委托调用。这很有效。它并没有太多困扰我。但感觉喜欢可能有更惯用的解决方案。
答案 0 :(得分:0)
当您将ViewController1呈现/推送到ViewController2时,只需将对象的委托更改为ViewController2即可。就像传递变量一样传递你的代表。
例如: 如果您使用的是storyboard segue
- (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类及其委托方法
答案 1 :(得分:0)
我不知道它是否适合您的情况但是,如何制作asuper视图控制器来管理代理的东西,并使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
方法。