了解委托。委托是一种常用的方法,可以将对象的内容发送给它们的“父对象”或任何其他对象。
您的子视图应该有一个“委托”属性(实际上可以称为任何东西,这只是一个约定)。您可以在子视图中添加按钮。
您像这样声明委托:
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];
}
您还应该阅读protocols,这将使上述代码更加健壮,并帮助您确保只在委托上调用正确的方法,但我不想让这个示例复杂化。
编辑:是的,摆脱警告的最干净的方法是使用协议。只需将其放在单独的 .h 文件中即可:
@protocol SwitchingDelegate
- (void) didPressButtonToSwapView;
@end
在 UINavController 标头中包含这个 .h,并说 UINavController 实现了协议:
@interface MyNav: UINavController <SwitchingDelegate> { ...
在实现中实现该方法(您不需要在接口中添加任何内容)。
在您的 ChildView 中,说委托必须实现协议:将所有声明更改为:
id<SwitchingDelegate> delegate;
然后编译器通过检查委托对象是否真正实现协议来帮助您。正确完成所有这些操作后,您应该不会收到任何警告。