2010-03-31 16 views
0

也許是本網站的常見問題解答。從iPhone中的子視圖中設置ivar在objective-c中

我有一個TableViewController持有一個窗體。在這種形式中,我有兩個字段(每個字段都在自己的單元格中):一個選擇誰支付(單選),另一個選擇人員支出(多選)。

這兩個字段都會打開包含在UINavigationController中的新TableViewController。

單選擇字段(支付的)保持對象會員 多重選擇字段(支付)持有的NSMutableArray

兩個瓦爾被髮送到相同的新的控制器相同的方式的對象:

mySingleSelectController.crSelectedMember = self.crPaidByMember; 
myMultipleSelectController.crSelectedMembers = self.crSelectedMembers; 

來自付費爲控制器我使用didSelectAtIndexPath方法來設置成員的可變數組爲誰支付:

if ([[tableView cellForRowAtIndexPath:indexPath] accessoryType] == UITableViewCellAccessoryCheckmark) { 
    [self.crSelectedMembers removeObject:[self.crGroupMembers objectAtIndex:indexPath.row]]; 
    //... 
} 
else { 
    [self.crSelectedMembers addObject:[self.crGroupMembers objectAtIndex:indexPath.row]]; 
    //... 
} 

到目前爲止一切順利。一個可變數組(crSelectedMembers)完全從子視圖設置。 但是... 我在設置Membership對象時遇到了問題。

從支付的控制器我用didSelectAtIndexPath設置會員:

[self setCrSelectedMember:[crGroupMembers objectAtIndex:indexPath.row]]; 

通過NSlogging crSelectedMember我獲得選擇自我成員的權利,但在父母看來,指出其伊娃,沒有什麼改變。

我做錯了什麼?原因我可以調用crSelectedMembers的方法,但我無法更改crSelectedMember的值。

回答

0

如果我理解你的問題,最可能的原因是不當的財產申報。

如果要使用每個對象屬性將值從一個對象傳遞到另一個對象,則需要確保使用assign以確保一個對象中的屬性指向與另一個對象中的屬性相同的實例。

因此,在您topViewController你有一個屬性:

@property (nonatomic,retain) NSString crSelectedMember; 

然後在你的子視圖控制器,你必須:

@property (nonatomic,assign) NSString crSelectedMember; 

這迫使值轉換成父控制器的確切對象。

但是,這是在viewControllers之間傳遞數據的一種非常脆弱的方式。隨着你的應用程序變得更加複雜,跟蹤所有傳遞的數據將變得不可能。 (更糟糕的是,如果遇到內存限制,父視圖控制器可能會卸載,甚至在您嘗試將數據傳遞給它時甚至不存在。)

相反,您應該有一個專用於保存數據的自定義對象。每個視圖控制器都應該查詢該對象的所需數據,並將任何更改寫回該對象。視圖控制器從不直接通信。這種技術可以讓你在一個特定的位置控制數據,而不是將它分散到你的代碼中,並且它可以很好地擴展。您可以將任意數量的視圖控制器添加到您的應用程序,而無需擔心將它們全部捆綁在一起。

看到這個職位的詳細信息:iPhone: How to Pass Data Between Several Viewcontrollers in a Tabbar App

+0

謝謝!我認爲鏈接帖子中提到的辛格爾頓方法可以解決這個問題。 – Ivan 2010-04-01 10:09:12

相關問題