【问题标题】:How do you set an instance variable in one object from another?如何在一个对象中从另一个对象中设置实例变量?
【发布时间】:2011-07-31 14:52:25
【问题描述】:

我有一个 AppController 对象,其中包含一个实例变量 int adventures。 这通过 Interface Builder 绑定到标签。

我还有一个名为 PopUpWindow 的 NSWindowController 子类。单击回车按钮时,弹出窗口文本字段中的值应更改 AppController 对象中的变量adventures

即使将@public@package 用于adventures,它也不会改变。我也在尝试使用

[self willChangeValueForKey:@"adventures"];

来自 PopUpWindow 类。这会跨班级工作吗?我该怎么做?

【问题讨论】:

    标签: objective-c cocoa binding instance


    【解决方案1】:

    这可能是 NSNotifications 的好地方,你 AppController 可以注册一个命名通知,我什至不在乎什么对象发送它,你 PopUpWindow 可以发布一个通知,你的 AppController 可以接收通知。另一种可能性是,如果 PopUpWindow 由 AppController 控制器拥有,它可以将 AppController 作为委托并向其委托发送消息。你这行代码

    [self willChangeValueForKey:@"adventures"];
    

    似乎表明您的 AppController 中正在发生这种情况,但因此没有用,因为这只会告诉您 AppController.adventures 的观察者它已更改并且您希望它以另一种方式工作,我假设输入按钮是单击它会向您发送一条消息 PopUpWindow NSWindowController。

    【讨论】:

    • 实际上反之亦然。当应用程序加载时,会弹出一个窗口面板,其中包含一个文本字段和要求输入值的按钮。该值应该设置 AppController 中的变量冒险。我不确定如何使用 NSNotifications,但我手头有参考书可以提供帮助。我也尝试在 PopUpWindow 中创建一个变量 numOfAdventures 并将其绑定到标签,那么为什么当我在 IB 中创建对象并将标签绑定到 PopUpWindow.numOfAdventures 时它不起作用?
    • 作为一个快速更正,我实际上在我的窗口控制器中分配了 AppController 并调用 [controller willChangeValueForKey:@"adventures"]; 而不是 self。
    • 我通过摆脱 NSWindowController 的子类并使用 IBOutlet NSWindow *popUpWindow; 解决了我的问题,使其在启动时可见,并在单击 Enter 按钮时关闭。我唯一不知道该怎么做就是在你需要的时候让它重新打开。我习惯了 NSWindowController 的showWindow 方法。这是我第一次使用 NSWindow。
    • 通知非常简单,是一种非常有用的机制,可以分离代码并将状态更改广播到应用程序的许多部分。这是你应该得到的东西。 willChangeValueForKey: 通常用在键值绑定中,这样冒险的访问器方法将把这个方法发送给自己,然后在发送 didChangeValueForKey: 之后。这样,在接口构建中设置的该值的任何键值观察者都可以收到更改通知。
    猜你喜欢
    • 2018-12-13
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多