xcode从其他视图控制器访问类变量/属性

时间:2011-04-26 19:01:40

标签: xcode class variables properties instance

我有一个带有4个标签的UITabBar应用程序。每个选项卡都有自己的ViewController。

有时我想从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访问该属性?我做错了什么?

谢谢, 专利

2 个答案:

答案 0 :(得分:1)

您是否有Tab1ViewController的实例?您正在尝试访问类的属性,而不是类的实例。这只有在属性是静态的情况下才有效。 我还应该警告你,相互通信的标签可能表明你的应用程序的设计缺乏清晰度。理想情况下,您的视图控制器应该与中心位置通信。

答案 1 :(得分:1)

我建议您尝试将控制器彼此分离。当任何控制器可以知道任何其他控制器时,对任何一个控制器的更改可能需要更改所有其他控制器。这不会扩展,并使您作为开发人员的生活变得不必要的困难。

相反,有许多有效的模式可以将您的应用程序分解为自包含的模块,这些模块仍然可以进行通信,但不需要那种应用程序范围的紧密耦合。

如果要在控制器之间发送事件,则考虑委托模式以允许一个控制器与第二个委托控制器通信,而不需要该委托知道第一个控制器。 更好的是发出通知,允许控制器宣布这些事件,而无需了解其他控制器正在监听它们。

如果要在控制器之间共享数据,则构造共享模型对象(或用于获取ManagedObjectContext等模型的服务)来存储此数据,并为每个控制器提供对它的引用。这样您的应用程序委托可能会构建此模型并将其传递给每个控制器。每个控制器都可以观察模型的变化并根据需要对模型进行修改,而无需了解使用该模型的其他控制器。

Apple的WWDC关于MVC的演讲可能对您有用。