Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在iOS中管理ViewController_Ios_Viewcontroller - Fatal编程技术网

如何在iOS中管理ViewController

如何在iOS中管理ViewController,ios,viewcontroller,Ios,Viewcontroller,我在ViewController之间传输数据时遇到问题。 我现在正在开发一个小应用程序,它有一个主viewcontroller,在这个viewcontroller中,用户可以更改一些全局数据,所有其他viewcontroller将使用这些数据从internet获取数据。因此,当全局数据更改时,我需要通知其他ViewController更新数据 问题是,当全局数据发生更改时,如何告知其他ViewController 我知道我应该使用NSNotificationCenter来解决这个问题,但我觉得通

我在ViewController之间传输数据时遇到问题。 我现在正在开发一个小应用程序,它有一个主viewcontroller,在这个viewcontroller中,用户可以更改一些全局数据,所有其他viewcontroller将使用这些数据从internet获取数据。因此,当全局数据更改时,我需要通知其他ViewController更新数据

问题是,当全局数据发生更改时,如何告知其他ViewController

我知道我应该使用NSNotificationCenter来解决这个问题,但我觉得通知对于所有的ViewController来说都是一个外国人

我想做的是添加一个ViewControllerManager来管理所有ViewController。首先,我会将需要使用全局数据的所有viewcontroller添加到管理器中。 然后,当全局数据更改时,我可以通过管理器找到这些ViewController,并通知它们直接更新全局数据

这是我的@界面

@interface ViewControllerManager : NSObject
+ (ViewControllerManager *)sharedManager;
- (void)addViewController: (UIViewController *)viewController;
- (void)removeViewController: (UIViewController *)viewController;
- (void)removeViewControllerByClass: (Class)aClass;

- (UIViewController *)viewControllerByClass: (Class)aClass;
- (NSArray *)viewControllersByClass: (Class)aClass;

//get viewcontrollers who can response to selector, so I can send them this message.
- (NSArray *)viewControllersResponseTo: (SEL) selector;

//get current visible viewcontroller.
@property (nonatomic, retain) UIViewController * visibleViewController;

@end


它工作得很好,通过这个管理器我可以得到我想要的任何viewcontroller,我可以在viewcontroller之间轻松地传输全局数据,但问题是我不知道如何正确管理内存,在方法
[ViewControllerManager addViewController::
中,我保留了viewcontroller,但是我不知道什么时候发布它,所以这个viewController永远不会被解除锁定…

您有可能发布的最新时间点是在manager类的解除锁定方法中。如果在添加控制器时将这些控制器存储在阵列中,阵列也会保留它们。这可能是一种仅保留和释放该阵列而不是控制器的解决方案。从阵列中移除项目时,阵列将执行必要的释放。此外,当数组消失(释放)时,项目也消失(自动)


顺便说一句,我想你所做的就是所谓的中介模式。控制器仅与中心对象通信,彼此不通信。只有调解人知道所有的演员

最后,我使用弱引用解决了这个问题,代码如下:

感谢您的帮助,我将进一步研究中介模式。