调用rootViewController在内容视图(iOS)中切换视图

时间:2011-02-13 03:35:44

标签: iphone objective-c xcode ipad ios

我正在为iOS制作一个非常简单的多视图应用程序,我一直在Apress book中关注一个很棒的教程。我基本上已经将我的rootViewController实例化并与app delegate一起显示,并且我有许多内容viewControllers(6),我想根据用户输入交换进出。但是,在本书中,他们使用Interface Builder在rootView上的工具栏上执行开关。它在rootView中触发一个方法,该方法加载新内容ViewController并显示它。

我的问题是我想执行内容视图切换(位于我的rootViewController实例中),但我想用我的内容视图中的按钮触发切换操作(因此不可用我的文件所有者是我的contentViewController,其引用保存在我的rootViewController中。

希望我已经解释得很好,如果我要详细说明,请告诉我。我感谢任何帮助!

2 个答案:

答案 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中看到这一点,操作系统提供标准表,但它会回调您的代码以根据需要提供单个单元格。

要实现协议,您必须执行以下操作:(请参阅下面的代码段

  1. 声明会话协议
  2. 指定父级将遵循该协议
  3. 在您的孩子中创建一个委托属性
  4. 当父母即将启动孩子时,它会将自己指定为该孩子的代表。
  5. 当孩子想要切换时,它会使用该协议调用父级

  6. @protocol myVCDelegate
        - (void)switchToDifferentController:(int) viewNumber ;
    @end
    
    
    @interface ParentViewController : UIViewController <VCDelegate>
    
    @property(nonatomic, assign) id <VCDelegate> delegate
    
    childController.delegate = self;
    
    [self.delegate switchToDifferentController:kController5];