我正在为iOS制作一个非常简单的多视图应用程序,我一直在Apress book中关注一个很棒的教程。我基本上已经将我的rootViewController实例化并与app delegate一起显示,并且我有许多内容viewControllers(6),我想根据用户输入交换进出。但是,在本书中,他们使用Interface Builder在rootView上的工具栏上执行开关。它在rootView中触发一个方法,该方法加载新内容ViewController并显示它。
我的问题是我想执行内容视图切换(位于我的rootViewController实例中),但我想用我的内容视图中的按钮触发切换操作(因此不可用我的文件所有者是我的contentViewController,其引用保存在我的rootViewController中。
希望我已经解释得很好,如果我要详细说明,请告诉我。我感谢任何帮助!
答案 0 :(得分:5)
当您在自定义初始化方法中创建内容视图时,或者在创建内容视图后仅分配它时,您需要传递对根视图控制器(RootViewController * rootViewController)的引用: self.contentView.rootViewController =自我; 。
现在,在内容视图中,您可以在根视图控制器中调用相应的方法来进行切换: [self.rootViewController switchView] 。然后可以在按下按钮时调用的方法内触发此调用(IBAction方法)。
所以这就是你需要做的: 1)在RootViewController类型的内容视图控制器中创建一个属性
@class RootViewController;
@interface MyContentViewController : NSObject {
@private
RootViewController *rootViewController;
}
@property (retain) RootViewController *rootViewController;
并确保它保留参考。 2)合成属性并将回调添加到切换视图的根视图控制器:
@implementation MyContentViewController
@synthesize rootViewController;
- (IBAction) switchView:(id) sender {
[rootViewController switchToNextView];
}
-(void) dealloc {
[rootViewController release];
[super dealloc];
}
同时在最后发布您的保留参考。
3)将根视图控制器分配给RootViewController中的内容视图:
self.contentViewController = [[[MyContentViewController alloc]
initWithNibName:@"ContentView"
bundle:nil] autorelease];
self.contentViewController.rootViewController = self;
应该是全部。我希望能帮助你。
答案 1 :(得分:2)
好吧,您可以在每个调用的子控制器中创建一个IBAction:
[self.parentViewController switchToDifferentController:(int) viewNumber]
然后在root中实现switchToDifferentController方法。除了忽略编译器警告,即parentView可能没有实现该方法,它可能会起作用。
然而,这有点脆弱,因为你必须假设是父母打电话给你,并且没有人会忘记实施该方法。
通常,您使用子代理控制器的“委托”概念来要求其父级执行某些操作。一般的想法是你将一组方法声明为“协议”。将其视为对象之间的契约。一个对象可以说“我保证实现这些方法”,然后另一个可以选择将这些消息发送给它。合同允许编译器/系统检查一致性。您将在UITableView中看到这一点,操作系统提供标准表,但它会回调您的代码以根据需要提供单个单元格。
要实现协议,您必须执行以下操作:(请参阅下面的代码段
@protocol myVCDelegate
- (void)switchToDifferentController:(int) viewNumber ;
@end
@interface ParentViewController : UIViewController <VCDelegate>
@property(nonatomic, assign) id <VCDelegate> delegate
childController.delegate = self;
[self.delegate switchToDifferentController:kController5];