通过Segue交出代表 - 糟糕的模式?

时间:2015-05-11 03:56:35

标签: ios objective-c iphone delegates

我有一些Obj-c代码工作正常,但我想知道它是否使用了“反模式”,如果有一个明显更好的路线,更有经验的人可能会采取。

  • ViewController1充当从第三方库实例化的对象的委托。它在前台。
  • ViewController2即将到来。在segue期间,在prepareForSegue中,ViewController1设置当前作为ViewController2的委托的对象的委托,以便在ViewController2处于前台时接收任何后续委托调用。

这很有效。它并没有太多困扰我。但感觉喜欢可能有更惯用的解决方案。

2 个答案:

答案 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方法。