我有2个具有单独类的ViewControllers。在第一个视图上我有一个开关,在该开关上我希望能够单击该开关并隐藏另一个视图上的一些对象。但我正在运行的问题是能够使用其他类上的对象。我已经在每个方法上导入了两个头文件,并且我仍然无法将第二个viewcontroller上的对象用于第一个viewcontroller。
让我们说我在第一个视图控制器上有一个标签并为它创建一个插座并称之为“#34; ice"在第一个方法文件,现在我希望能够在另一个viewcontroller /方法上调用和使用ice。所以我可以做类似
的事情ice.hide = true
在另一个方法文件上。但是当我输入“冰”时,我会收到错误消息。喜欢' ice'确实存在。
答案 0 :(得分:1)
您在iOS中有一些选项可以实现您的目标。如果两个视图控制器视图都已加载并且在屏幕上或者如果使用导航控制器然后在堆栈中,那么以下选项将起作用:
NSNotification
并在两个UIViewController
实例之间发送信息。delegate
模式通过调用委托中的特定方法来发送消息。选项中NSNotification
适用于解耦,但如果您在应用程序周围有大量通知,则可能会很麻烦。
Delegate是一种文档化的方法,在iOS中被广泛使用,因此会对其进行调查。
使用完成代码块并且更加迅速,但如果保留了范围变量,则可能会导致问题,从而可能出现循环保留周期。
答案 1 :(得分:1)
简短的回答:不要这样做。它违反了封装原则,是面向对象编程的重要思想。 (它是可能,但是这样一个坏主意,我不会解释如何去做。)
您应该做的是在视图控制器中添加公共方法或属性,并在实现这些方法或属性时更改您的用户界面。
假设你有一个显示新闻文章的VC(ViewController),它有一个标题标签和一个正文字段。
不要尝试直接更改titleLabel或bodyField,而是添加NNString属性title
和body
。在这些属性的setter中,保存新值,并尝试将其显示给VC视图。我说"尝试"因为外部调用者可能会在加载VC的视图之前调用您的属性设置器。您还需要在viewWillAppear方法中将属性值安装到视图中。
一旦您设置了可以更改VC设置的属性或方法,就可以使外部代码与视图控制器的连接不紧密。
使用上面的方法,外部视图控制器必须在编译时将视图控制器的头文件设置为#import,并且只能与那种视图控制器通信。
相反,在新闻文章视图控制器的示例中,我们有几种不同类型的视图控制器,它们具有标题和正文字段,但它们从不同的基类继承。
您可以定义protocol
,这是一组已定义的方法,并且您拥有不同的视图控制器"符合"那个协议。这就像创建一种专门的语言,并让某些视图控制器说"我理解这种语言"。
然后外部对象可以在符合协议的任何对象上设置title或body属性,而不知道或关心它是什么类型的对象。
darren的答案中提到的委托模式是使用协议在对象之间创建松散耦合的示例。