【问题标题】:Confused about self and delegation对自我和委托感到困惑
【发布时间】:2012-06-28 08:18:38
【问题描述】:

此代码来自 Utility 应用程序,由 Apple 在创建项目时添加。

这有什么区别:

- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller
{
    [self dismissModalViewControllerAnimated:YES];
}

还有这个:

- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller
{
    [controller dismissModalViewControllerAnimated:YES];
}

它们都可以工作,但第一个是来自实用程序应用程序的主要代码,由 Apple 添加。 那么有什么区别,为什么 self 有效? self 是 MainViewController,而不是 FlipsideViewController。我不知道,这与委托有关吗? 谢谢。

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

    这完全取决于哪个对象正在执行flipsideViewControllerDidFinish;如果与controller相同,则相同。

    在实践中,有时会发生委派的类(在您的情况下为 FlipsideViewController),也实现了委托协议(即,充当委托)。在这种情况下,selfcontroller 是相同的。这将对应于委托初始化(例如在 init 方法中),例如:

     self.delegate = self;
    

    但是您可以让您的委托是不同的类(例如,应用程序委托或其他),在这种情况下它们会有所不同。在这种情况下,您会说(例如在 init 中):

    self.delegate = [UIApplication sharedApplication].delegate;
    

    在这种情况下,您的应用程序委托将收到对FlipsideViewController 的调用,controller 参数告诉它所指的是哪个对象;在这种情况下,self != controller

    另一种情况是当您的委托充当多个对象的委托时;在这种情况下,controller 参数告诉哪个对象是委托对象。

    在实践中,在委托方法实现中,您可以安全地使用controller 参数而无需太多思考。

    【讨论】:

    • 谢谢,我现在明白了。
    【解决方案2】:

    我知道答案已经被选为正确,并且 Sergio 已经很好地解释了委托,但在这个特定情况下,答案要简单得多。 selfcontroller 在这种情况下不是一回事(正如你在问题中所说的那样)。 self 是呈现控制器,controller 是呈现控制器。所以,这两个调用都起作用的原因是:

    呈现视图控制器负责关闭视图 它呈现的控制器。如果您在呈现的视图上调用此方法 控制器本身,但是,它会自动将消息转发到 呈现视图控制器。

    来自 Apple 的 documentation UIViewController

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-18
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 2011-01-14
      相关资源
      最近更新 更多