2011-06-19 20 views
1

我有你的類:HopBill,HopBillController和HopBillSheetController。 HopBill創建一個持有NSMutableArray的對象。出於測試目的,我已經在HopBill的init方法中向數組添加了一行。 HopBillController.h有#import "HopBill.h"和HopBillController.m初始化對象在它的awakeFromNib方法:aHopBill = [[HopBill alloc] init];。到現在爲止還挺好。從HopBillController.m中,我可以調用方法到aHopBill對象。它檢索在init等插入的行。對象(持有NSMutableArray)在父/子類中具有不同的內容

HopBillSheetController是HopBillController的子項,基本上是按下按鈕後彈出的表單。填寫完一些字段後,需要向aHopBill添加一行關閉表單。在HopBillSheetController我:

#import "HopBillController.h"

@interface HopBillSheetController : HopBillController {

我可以從HopBillSheetController.m所有方法來檢索插在初始化行。一切似乎都很好。但是,當我填寫表格中的字段並按下確定(爲了向aHopBill添加一行)HopBillSheetController在HopBillController中調用一個方法:[super addHopAddition: [variety stringValue]];。該行被添加,但是當我從HopBillController.m中的aHopBill檢索所有行時,它只返回在aHopBill的init中插入的行。當我從表單中執行同樣的操作時,它會返回插入在aHopBill的init中的行以及剛添加到表單中的行。

就好像我有兩個aHopBill對象,但顯然這需要是一個單獨的對象。我究竟做錯了什麼?

+0

猜猜我不知道系統如何工作:) – Joran

回答

2

您正在將您的類層次結構與UI對象層次結構混淆。從類繼承與作爲子窗口不是一回事。

HopBillSheetController類當前從HopBillController繼承。這意味着它有效地擁有自己的HopBillController實例super。該實例與您窗口關聯的實例完全分離。正如你發現的那樣,更改一個不會影響另一個。

這不是你想要的。您想要關聯實際的對象,而不是類結構。你怎麼去了解它取決於如何創建整個安裝和結構,但它可能歸結爲這些選項之一或其他:

  • 如果你把UI一起在Interface Builder(或任何我們現在稱之爲),您需要將適當的IBOutlet實例變量放入您的類中,並使用UI工具在它們之間建立連接。

  • 如果在代碼中進行連接,則需要添加屬性(或其他合適的存取器方法),以便一個類中的代碼可以在另一個類中獲取必需的對象實例。

無論哪種方式,你都應該失去兩個類之間的僞造繼承。

+0

謝謝,我要去嘗試屬性部分。事情最終我需要從MyDocument類(基於文檔的應用程序)訪問對象aHopBill。所以屬性是我想要的方式。再次感謝! – Joran

+0

我讀過這個網頁:http://cocoacast.com/?q = node/103並理解它對於簡單變量。但我在這裏工作的對象。我會怎麼做? – Joran

+0

@Joran原理是一樣的。對象指針與任何其他值非常相似,您只需要更加關心所有權。對於像這樣的UI對象屬性,您可能希望聲明爲「retain」和「readonly」,儘管這不會被切割和乾燥。閱讀[properties文檔](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html),並仔細想想你需要如何關聯對象。閱讀其餘的Objective-C文檔,特別是關於對象所有權和內存管理。 – walkytalky

相關問題