2011-04-26 109 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讨论会对你有用。