iPhone:从外部根控制器切换视图

时间:2010-04-22 16:10:30

标签: iphone objective-c cocoa-touch

我正在使用UINavigationController在视图之间切换。我希望每个视图能够通过在视图中使用按钮来控制何时将其换出另一个视图。到目前为止我见过的所有样本都在工具栏上放置了按钮,该工具栏位于包含Switch View Controller的根视图中,而不是视图,它们是self。有可能做我想要的吗?我无法想象如何将连接连接回UINavigationController。

我正在努力解决这个问题,所以如果您需要进一步澄清,请随时告诉我。

1 个答案:

答案 0 :(得分:2)

了解代表。代表是一种常见的方法,可以将对象中的内容发送给他们的“父母”或任何其他对象。

您的子视图应该有一个“委托”属性(实际上可以调用任何东西,这只是一个约定)。您可以在子视图中使用按钮。

您可以像这样声明委托:

interface ChildView : UIViewController {
    id delegate;
}

@property (assign) id delegate;

implementation ChildView

@synthesize delegate;

然后,当您在UINavigationController中设置子视图时,您可以:

ChildView *childView = [[ChildView alloc] init...]
childView.delegate = self;

在您的子视图中,您有一个按钮方法:

- (IBAction) didPressButton:(id)sender {
    [self.delegate didPressButtonToSwapView];
}

在你的UINavigationController中,你有一个方法:

- (void) didPressButtonToSwapView {
    [self popViewController]; // use the right names, I made these up :)
    [self pushAnotherViewController];
}

您还应该阅读协议,这将使上述代码更加健壮,并且可以帮助您确保只在委托上调用正确的方法,但我不想让这个示例复杂化。 / p>

编辑:是的,摆脱警告的最简洁方法是使用协议。把它放在一个单独的.h文件中:

@protocol SwitchingDelegate
- (void) didPressButtonToSwapView;
@end

在UINavController标头中包含此.h,并说UINavController实现协议:

@interface MyNav: UINavController <SwitchingDelegate> { ...

在实现中实现该方法(在界面中不需要任何其他内容)。

在您的ChildView中,假设委托必须实现协议:将所有声明更改为:

id<SwitchingDelegate> delegate;

然后,编译器会通过检查委托对象是否真正实现协议来帮助您。正确完成所有这些后,您不应该收到任何警告。