objective-c - 对象(持有 NSMutableArray)在父/子类中具有不同的内容

标签 objective-c cocoa class inheritance

我有三个类:HopBill、HopBillController 和 HopBillSheetController。 HopBill 创建一个包含 NSMutableArray 的对象。出于测试目的,我已经在 HopBill 的 init 方法中向数组添加了一行。 HopBillController.h 有 #import "HopBill.h" 并且 HopBillController.m 在它的 awakeFromNib 方法中初始化该对象:aHopBill = [[HopBill alloc] init] ;。到目前为止,一切都很好。从 HopBillController.m 我可以调用 aHopBill 对象的方法。它检索在 init 等中插入的行。

HopBillSheetController 是 HopBillController 的子级,基本上是按下按钮后弹出的工作表。填写一些字段后,需要向HopBill 添加一行并关闭工作表。在 HopBillSheetController 中我有:

#import“HopBillController.h”

@interface HopBillSheetController : HopBillController {

我可以使用 HopBillSheetController.m 中的所有方法来检索 init 上插入的行。一切看起来都很好。但是,当我填写工作表中的字段并按“确定”(为了向 aHopBill 添加行)时,HopBillSheetController 会调用 HopBillController 中的一个方法:[super addHopAddition: [variety stringValue]];。该行被添加,但是当我从 HopBillController.m 中的 aHopBill 检索所有行时,它仅返回在 aHopBill 的 init 中插入的行。当我在工作表中执行相同操作时,它会返回在 aHopBill 的 init 中插入的行以及我刚刚在工作表中添加的行。

就好像我有两个 aHopBill 对象,但显然这需要是一个对象。我做错了什么?

最佳答案

您将类层次结构与 UI 对象层次结构混淆了。从类继承与子窗口完全不同。

您的 HopBillSheetController 类当前继承自 HopBillController。这意味着它实际上拥有自己的 HopBillController 实例作为其super。该实例与与您的窗口关联的实例完全分开。正如您所发现的,对其中一项的更改不会影响另一项。

这根本不是你想要的。您想要关联实际的对象,而不是类结构。如何进行取决于整个设置的创建和结构方式,但它可能归结为以下选项之一:

  • 如果您将 UI 放在 Interface Builder(或者我们现在所说的任何名称)中,则需要将适当的 IBOutlet 实例变量放入您的类中,并使用 UI 工具在它们之间建立连接。

  • 如果您在代码中建立连接,则需要添加属性(或其他合适的访问器方法),以便一个类中的代码可以获取另一个类中必要的对象实例。

无论哪种方式,您都应该失去两个类之间的虚假继承。

关于objective-c - 对象(持有 NSMutableArray)在父/子类中具有不同的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6402195/

相关文章:

ios - 如果我们不在 init 方法中检查 "if (self)"会发生什么?

c# - 监听以编程方式创建的 NSView 的事件

objective-c - 根据按键更改 NSPopUpButton 项目的可见性

iphone - UIScrollView contentSize 被重置

c++ - 为什么以及何时通过指针在 C++ 中传递类类型?

iphone - writeToFile路径?

iphone - 测试应用程序是否确实从 UILocalNotification 变为事件状态

c# - MustInherit 和抽象类的区别

iPhone SDK : NSMutableAttributedString buggy behavior when using CTFramesetterCreateFrame

javascript - 如何将使用 "this"关键字的函数传递到 JavaScript 类中?