此代码来自Utility app,由Apple在创建项目时添加。
这有什么区别:
- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller
{
[self dismissModalViewControllerAnimated:YES];
}
而且:
- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller
{
[controller dismissModalViewControllerAnimated:YES];
}
它们都有效,但第一个是Apple提供的Utility app的主要代码。 那么有什么不同,为什么自我运作? self是MainViewController,而不是FlipsideViewController。我不知道,这与代表团有关吗? 谢谢。
答案 0 :(得分:2)
这完全取决于正在执行的对象flipsideViewControllerDidFinish
;如果它与controller
相同,那么它就是一样的。
实际上,有时候委托的类(在你的情况下是FlipsideViewController
)也实现了委托协议(即,充当委托)。在这种情况下,self
和controller
是相同的。这将对应于委托初始化(例如,在init方法中),如:
self.delegate = self;
但是你可以让你的委托成为一个不同的类(例如,应用程序委托,或者其他),在这种情况下,它们会有所不同。在这种情况下,你会说(例如在init中):
self.delegate = [UIApplication sharedApplication].delegate;
在这种情况下,应用程序委托将接收对FlipsideViewController
的调用,controller
参数将告知它引用的对象;在这种情况下,self
!= controller
。
另一种情况是当您的委托充当多个对象的委托时;在这种情况下,controller
参数告诉哪个对象是委托对象。
实际上,在委托方法实现中,您可以安全地使用controller
参数而无需考虑。
答案 1 :(得分:2)
我知道答案已被选为正确的,Sergio在解释授权方面做得很好,但在这个具体案例中,答案要简单得多。在这种情况下,self
和controller
不是一回事(正如您在问题中所说的那样)。 self
是呈现控制器,controller
是呈现的控制器。因此,两个调用都有效的原因是:
呈现视图控制器负责解除视图 它呈现的控制器。如果在显示的视图上调用此方法 但是,控制器本身会自动转发消息 呈现视图控制器。
来自Apple UIViewController
上的{{1}}