3

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

这有什么区别:

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

还有这个:

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

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

4

2 回答 2

2

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

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

 self.delegate = self;

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

self.delegate = [UIApplication sharedApplication].delegate;

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

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

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

于 2012-06-28T08:27:39.413 回答
2

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

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

来自 Apple的文档UIViewController

于 2012-06-28T08:51:30.820 回答