理解/澄清视图控制器语法
Posted
技术标签:
【中文标题】理解/澄清视图控制器语法【英文标题】:Understanding/clarifying view controller syntax 【发布时间】:2013-08-24 17:18:26 【问题描述】:我这几天一直在看视图控制器(搜索 xcode 帮助、google 和堆栈溢出),我想我对它有一些了解,但不是很多。 我有一些代码,我很难理解。 所以这里有我在看的书中找到的以下代码,不知道是不是理解正确。
-(void)prepareForSegue(UIStoryboardsegue *)segue sender:(id)sender
((ViewController2 *)segue.destinationViewController).delegate = self;
首先,我不知道为什么要在这里转换为我们的第二个视图控制器(viewController2)。 我想我得到了剩下的,我们获取方法的 segue 参数(它包含有关 segue 中涉及的视图控制器的信息),并且我们访问destinationViewController(意味着我们想要访问我们将要访问的视图控制器)。然后我们将目标视图控制器的委托属性设置为 self。我相信我们将delegate属性设置为self,因为我们想将消息发送到我们将要访问的视图控制器中的delegate。
这是我没有得到的最后一个:
在头文件中:
@property (weak, nonatomic)id delegate;
在实现文件中:(controllerVisisble 属性是一个布尔值,当用户点击一个按钮执行手动segue 到第二个视图控制器,也就是这个时,它会变为YES)
-(void)viewWillDisappear:(BOOL)animated
[super viewWillDisappear:animated];
((ViewController *)self.delegate).controllerrVisisble=NO;
这就是我认为这样做的:viewWillDisappear 方法在视图关闭/删除时被调用。
我不太确定 [super viewWillDisappear:animated],但我猜它会在视图消失时给出动画?但是,我删除了那条线,并且我的 dismissViewControllerAnimated 方法仍然会在视图消失时给出动画控制器被解雇。
这是真正让我感到困惑的部分。我们需要以某种方式访问第一个视图控制器的 dateChooserVisible 属性,将其设置为 NO,这样我们就可以通过我们的按钮再次访问第二个视图控制器。但是,我不明白为什么我们必须进行类型转换(viewController *),然后输入 self.delegate。我也不明白为什么我们在头文件中创建了一个名为delegate的属性,在这里使用。
【问题讨论】:
【参考方案1】:其中很多问题都比仅在视图控制器的上下文中更为通用。
[super methodName]
调用名为 methodName 的方法的超类实现。在您的情况下,Apple 在 UIViewController 的 viewWillDisappear:
方法中编写了一些代码(我们无权访问)。重写超类中的方法时始终调用 super。
请注意,viewWillDisappear:
只是在视图设置为消失时触发的回调。我的猜测是,这个方法的超级实现会将此回调转发到子视图控制器,尤其是在标准容器类(如UINavigationController
和UITabBarController
)的情况下。
就委托而言,协议和委托是 Objective-C 的主要部分,并广泛用于 Apple 的 API。 This link 可能会帮助您了解它们的工作原理;它对我帮助很大。
【讨论】:
你进行强制转换是因为编译器只知道目标控制器是一个通用视图控制器,所以你必须告诉它是一个特定的自定义类。然后,您可以分配在 segue 期间在控制器之间传递数据引用所需的属性。 好点,我错过了那个,我只看到了(ViewController *)self
位。以上是关于理解/澄清视图控制器语法的主要内容,如果未能解决你的问题,请参考以下文章