0

这几天我一直在看视图控制器(搜索 xcode 帮助、google 和堆栈溢出),我想我对它有一些了解,但不是很多。我有一些代码,我很难理解。所以在这里我有我在我正在阅读的书中找到的以下代码,我不确定我是否理解正确。

-(void)prepareForSegue(UIStoryboardsegue *)segue sender:(id)sender{
    ((ViewController2 *)segue.destinationViewController).delegate = self;
}

首先,我不知道为什么我们在这里将类型转换为我们的第二个视图控制器(viewController2)。我想我得到了剩下的,我们获取方法的 segue 参数(它包含有关 segue 中涉及的视图控制器的信息),并且我们访问destinationViewController(意味着我们想要访问我们将要访问的视图控制器)。然后我们将目标视图控制器的委托属性设置为 self。我相信我们将委托属性设置为 self,因为我们想将消息发送到我们将要访问的视图控制器中的委托。

这是我没有得到的最​​后一个:

在头文件中:

@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 的属性,以便在这里使用。

4

1 回答 1

0

许多这些问题比仅在视图控制器的上下文中更为通用。

  • [super methodName]调用名为 methodName 的方法的超类实现。viewWillDisappear:在您的情况下,Apple 在 UIViewController 的方法中编写了一些代码(我们无权访问) 。重写超类中的方法时始终调用 super。

  • 请注意,viewWillDisappear:只要视图设置为消失,就会触发回调。我的猜测是该方法的超级实现将此回调转发到子视图控制器,尤其是在标准容器类(如UINavigationController和)的情况下UITabBarController

  • 类型转换似乎没有必要,如果接收者是类型id或在其@interface.

  • 就委托而言,协议和委托是 Objective-C 的主要部分,并在 Apple 的 API 中广泛使用。 此链接可能会帮助您了解它们的工作原理;它极大地帮助了我。

于 2013-08-24T17:56:56.957 回答