【问题标题】:Controlling objects on another View/Classes控制另一个视图/类上的对象
【发布时间】:2015-12-23 18:16:41
【问题描述】:

我有 2 个具有不同类的 ViewController。在第一个视图上我有一个开关,在那个开关上我希望能够单击该开关并隐藏另一个视图上的一些对象。但是我遇到的问题是能够使用其他类的对象。我已经在每种方法上都导入了两个头文件,但我仍然无法将第二个视图控制器上的对象用于第一个视图控制器。

假设我在第一个视图控制器上有一个标签并为它创建一个出口并在第一个方法文件上将其称为“冰”,现在我希望能够在另一个视图控制器/方法上调用和使用冰。所以我可以做类似的事情

ice.hide = true

在另一个方法文件上。但是当我输入“ice”时出现错误,例如“ice”不存在。

【问题讨论】:

    标签: ios objective-c methods


    【解决方案1】:

    为了实现您的目标,您在 iOS 中有一些选择。如果两个视图控制器视图都已加载并显示在屏幕上,或者如果使用导航控制器然后在堆栈中,则以下选项将起作用:

    1. 使用NSNotification 并在两个UIViewController 实例之间发送信息。
    2. 通过调用委托中的特定方法,使用delegate 模式在它们之间发送消息。
    3. 将代码块从一个传递到另一个,当操作发生时,可以调用代码块并执行您需要的更新。

    NSNotification 的选项有利于解耦,但是如果您在应用程序周围有很多通知,它可能会很麻烦。 Delegate 是一种记录方法,在 iOS 中被广泛使用,因此会对其进行研究。 使用完成代码块并且更快速,但如果您保留范围变量并因此可能导致循环保留周期,则会导致您出现问题。

    【讨论】:

      【解决方案2】:

      简短回答:不要那样做。它违反了封装原则,违反了面向对象编程的重要思想。 (这可能的,但这是一个糟糕的主意,我不打算解释如何做到这一点。)

      您应该做的是在视图控制器中添加公共方法或属性,并在这些方法的实现中更改您的用户界面。

      假设您有一个显示新闻文章的 VC (ViewController),它有一个标题标签和一个正文字段。

      不要尝试直接更改 titleLabel 或 bodyField,而是添加 NNString 属性 titlebody。在这些属性的设置器中,保存新值,并尝试将其显示到您的 VC 视图中。我说“尝试”是因为外部调用者可能会在加载您的 VC 视图之前调用您的属性设置器。您还需要在 viewWillAppear 方法中将属性值安装到您的视图中。

      一旦您设置了允许您更改 VC 设置的属性或方法,您就可以使外部代码与您的视图控制器不紧密耦合。

      使用上述方法,外部视图控制器必须在编译时将视图控制器的头文件#import,并且只能与那种视图控制器对话。

      相反,在新闻文章视图控制器的示例中,我们有几种不同类型的视图控制器,它们具有标题和正文字段,但它们继承自不同的基类。

      您可以定义一个protocol,这是一组已定义的方法,并让您的不同视图控制器“符合”该协议。这就像创建一种专门的语言,并让某些视图控制器说“我理解那种语言”。

      然后,外部对象可以在任何符合您的协议的对象上设置 title 或 body 属性,而无需知道或关心它是什么类型的对象。

      darren 的回答中提到的委托模式是使用协议在对象之间创建松散耦合的示例。

      【讨论】:

        猜你喜欢
        • 2018-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-13
        • 1970-01-01
        • 2015-06-17
        • 1970-01-01
        相关资源
        最近更新 更多