我有一个带有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访问该属性?我做错了什么?
谢谢, 专利
答案 0 :(得分:1)
您是否有Tab1ViewController
的实例?您正在尝试访问类的属性,而不是类的实例。这只有在属性是静态的情况下才有效。
我还应该警告你,相互通信的标签可能表明你的应用程序的设计缺乏清晰度。理想情况下,您的视图控制器应该与中心位置通信。
答案 1 :(得分:1)
我建议您尝试将控制器彼此分离。当任何控制器可以知道任何其他控制器时,对任何一个控制器的更改可能需要更改所有其他控制器。这不会扩展,并使您作为开发人员的生活变得不必要的困难。
相反,有许多有效的模式可以将您的应用程序分解为自包含的模块,这些模块仍然可以进行通信,但不需要那种应用程序范围的紧密耦合。
如果要在控制器之间发送事件,则考虑委托模式以允许一个控制器与第二个委托控制器通信,而不需要该委托知道第一个控制器。 更好的是发出通知,允许控制器宣布这些事件,而无需了解其他控制器正在监听它们。
如果要在控制器之间共享数据,则构造共享模型对象(或用于获取ManagedObjectContext等模型的服务)来存储此数据,并为每个控制器提供对它的引用。这样您的应用程序委托可能会构建此模型并将其传递给每个控制器。每个控制器都可以观察模型的变化并根据需要对模型进行修改,而无需了解使用该模型的其他控制器。
Apple的WWDC关于MVC的演讲可能对您有用。