我一直在看视图控制器几天(搜索xcode帮助,谷歌和堆栈溢出),我想我对它有一些了解,但不是很多。 我有一些代码,我无法理解。 所以这里我有以下代码,我在我正在阅读的书中找到,我不确定我是否理解正确。
-(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的属性,在这里使用。
答案 0 :(得分:0)
很多这些问题比视图控制器的上下文更通用。
[super methodName]
调用名为methodName的方法的超类实现。在您的情况下,Apple在UIViewController的viewWillDisappear:
方法中编写了一些代码(我们无法访问)。当从超类中重写方法时,总是调用super。
请注意,只要视图设置为消失,viewWillDisappear:
就会触发回调。我的猜测是,此方法的超级实现将此回调转发给子视图控制器,尤其是在UINavigationController
和UITabBarController
等标准容器类的情况下。
类型转换似乎没有必要,如果接收者是id
类型或者在{{1}中为被调用方法提供声明,则总是可以在没有编译器错误/警告的情况下调用方法}}
就代表而言,协议和委托是Objective-C的主要部分,并广泛用于Apple的API。 This link可能会帮助您了解它们的工作原理;它对我帮助很大。