2009-09-18 33 views
1

我的应用程序有一个主屏幕,用户总是从中启动,并从中以编程方式显示其他视图。我按照“开始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]在给定索引处获取对象。

+0

这确实清除了如何在视图控制器之间共享数据,谢谢。我仍然不清楚(即使阅读Apple的文档)是使用协议。具体而言,如果您使用Xcode“实用程序应用程序”模板创建应用程序,那么这些行会让我感到困惑: @protocol FlipsideViewControllerDelegate; @interface FlipsideViewController:UIViewController { \t id delegate; } 我不明白为什么这个委托变量设置。它看起来像用于提交/解散反面视图。 – Ian 2009-09-21 23:30:35

+0

我还没有读过你在帖子中提到过的第六章。但我可以猜测 - 很可能委托设置,以便FlipsideViewController可以发信号给它的父母(我。在FlipsideViewController之前的视图控制器) – dotnetcoder 2013-05-31 18:27:43

相关问题