管理多个视图控制器和数据

Posted

技术标签:

【中文标题】管理多个视图控制器和数据【英文标题】:Managing multiple view controllers and data 【发布时间】:2009-09-18 22:46:37 【问题描述】:

我的应用程序有一个用户始终从其开始的主屏幕,我想从该主屏幕以编程方式显示其他视图。我设置应用程序的方法与“开始 iPhone 开发”章节中的方法相同。 6,也就是使用一个RootViewController加载到其他视图控制器中。

本书使用按钮触发加载下一个视图控制器,但在我的应用程序中,我需要在函数调用结束时交换控制器并在视图之间共享数据(处理的 UIImages 等)。我没有使用标签栏或导航控制器。

我想知道的是,我是否应该让我的 MainViewController 成为根控制器并从那里制作 presentModalViewControllers?我想保留根模型,但我不太明白如何将它全部连接起来并共享数据。我看过提到使用协议和通知的帖子,但我还没有完全理解它。任何建议表示赞赏。

【问题讨论】:

【参考方案1】:

您要做的是在您的主视图控制器中添加一个Cocoa property,它引用您要与从属视图控制器共享的对象实例。

例如,如果我们想共享一个NSArray,我们在主视图控制器标题中指定它的属性:

@interface MainViewController : UIViewController 
  NSArray *myArray;


@property (nonatomic, retain) NSArray *myArray;

@end

在实现中,添加@synthesize指令并记住release-dealloc中的数组:

@implementation MainViewController

@synthesize myArray;

...

- (void) dealloc 
  [myArray release];
  [super dealloc];


@end

您还希望以完全相同的方式将此属性添加到从属于主视图控制器的视图控制器中。在它们的标题中,指定相同的变量名称和属性描述。

在您的主视图控制器中,当您准备好推送从属视图控制器时,您可以在推送之前相应地设置从属视图控制器的属性:

- (void) pushSubordinateViewController 
  SubordinateViewController *subVC = [[SubordinateViewController alloc] initWithNibName:@"SubordinateViewController" bundle:nil];
  subVC.myArray = self.myArray; // this sets the sub view controller's myArray property
  [self.navigationController pushViewController:subVC animated:YES];
  [subVC release];

同样,在您的下属视图控制器中,需要相应地设置其下属的数组属性,就在它推送自己的子子视图控制器之前。

通过以这种方式设置引用,每个视图控制器都指向同一个数组,包含所需的元素。

要使用数组,只需调用self.myArray,例如[self.myArray objectAtIndex:index] 获取给定索引处的对象。

【讨论】:

这确实阐明了如何在视图控制器之间共享数据,谢谢。我仍然不清楚(即使在阅读了 Apple 的文档之后)是协议的使用。具体来说,如果您使用 Xcode “实用程序应用程序”模板来创建应用程序,那么这些行让我感到困惑:@protocol FlipsideViewControllerDelegate; @interface FlipsideViewController : UIViewController id 委托;我不明白为什么要设置这个委托变量。看起来它用于显示/关闭翻转视图。 我没有读过你在帖子中提到的第 6 章。但我可以猜测——很可能设置了委托,以便 FlipsideViewController 可以向其父级发出信号(即在 FlipsideViewController 之前的视图控制器)

以上是关于管理多个视图控制器和数据的主要内容,如果未能解决你的问题,请参考以下文章

管理同一视图控制器的多个实例

Objective-C 管理多个视图控制器

IOS Interface Builder - 在单个视图控制器场景中管理多个视图

如何从容器/父视图控制器和多个子视图控制器共享数据数组

核心数据 - 管理上下文

多个窗口的核心数据和单独的撤消管理器?