2011-04-26 149 views
0

我有一個帶有4個選項卡的UITabBar應用程序。每個選項卡都有自己的ViewController。從其他視圖控制器xcode訪問類變量/屬性

有時我想訪問Tav2ViewControllerTab3中Tab1ViewController的變量。

例如:

Tab1ViewController.h

#import <UIKit/UIKit.h> 
@interface Tab1ViewController : UIViewController { 
NSMutableArray *contentArray; 
} 
@property (nonatomic, retain) NSMutableArray *contentArray; 
@end 

Tab2ViewController.m

#import "Tab2ViewController.h" 
#import "Tab1ViewController.h" 
@implementation Tab2ViewController 
- (void) viewDidLoad { 
NSLog(@"Data count Tab1: %@", [Tab1ViewController.contentArray count]); 
} 

這是行不通的,因爲它似乎Xcode的期望contentArray是一個方法。 但是我怎樣才能從另一個ViewController訪問屬性?我究竟做錯了什麼?

感謝, 帕特

回答

1

你有Tab1ViewController一個實例?您正嘗試訪問該類的屬性,而不是該類的實例。如果該屬性是靜態的,這隻會起作用。 我也應該警告你,相互溝通的標籤可能表明你的應用設計缺乏清晰度。理想情況下,您的視圖控制器應該與中心位置交談。

+0

因此,我可以在應用程序啓動後初始化App-Delegate中定義一些實例變量,並創建4個get-methods從每個tabcontroller接收這些實例? 這是最佳做法嗎? – crimi 2011-04-26 20:03:50

+0

@crimi - 這聽起來更有希望。你可以使用'[[UIApplication sharedApplication]委託]'來訪問你的應用程序的委託,或者你可以編寫你自己的委託協議來實現你的應用程序委託。 – Tejas 2011-04-26 20:10:25

1

我建議你試着將你的控制器從對方分離出來。當任何控制器可以知道任何其他控制器時,對任何一個控制器的更改可能需要對所有其他控制器進行更改。這不會擴展,並使您的開發生活變得不必要的困難。

取而代之的是,有許多有效的模式可以將您的應用程序分解爲獨立的模塊,這些模塊仍然可以進行通信,但不需要緊密耦合。

如果要在控制器之間發送事件,則考慮委派模式以允許一個控制器與第二個委派控制器進行通信,而不要求委派知道第一個控制器。 更好的是火警通知允許控制器公佈這些事件,而不需要知道其他控制器正在監聽它們。

如果您想要在控制器之間共享數據,然後構建一個共享模型對象(或用於獲取像ManagedObjectContext這樣的模型的服務)來存儲此數據併爲每個控制器提供對它的引用。這樣,您的應用程序委託可以構建此模型並將其傳遞給每個控制器。每個控制器都可以觀察對模型的更改並根據需要對其進行修改,而無需瞭解使用該模型的其他控制器。

蘋果公司關於MVC的WWDC討論會對你有用。