有两种方法可以使用。
- UINavigationController
- 代表们
从您的问题来看, UINavigationController 似乎是最好的选择,但我会向您展示两者。
UINavigationController
当您从应用程序委托加载 mainViewController 时,您需要将其包装在导航控制器中,如下所示:
AppDelegate.h
@property (strong, nonatomic) UINavigationController *navController;
AppDelegate.m
@synthesize navController = _navController;
//在 didFinishLaunchingWithOptions 中:
UIViewController *mainViewController = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
navController = [[UINavigationController alloc] initWithRootViewController:mainViewController];
self.window.rootViewController = nav1;
[self.window makeKeyAndVisible];
现在在您的 MainViewController 中,您对 UINavigationController 有了信心。
当您想从父母那里推给孩子时,您可以简单地执行以下操作:
ChildViewController *child = [[ChildViewController alloc]...];
[self.navigationController pushViewController:child animated:YES];
如果您在 ChildViewController 中并想返回,只需执行以下操作:
[self.navigationController popViewControllerAnimated:YES];
这就是“向下钻取”技术。
(我知道“Drill Down”的意义远不止于此,但它提供了一个很好的参考框架。)
代表
现在,您拥有的另一种方法是在类之间设置委托。因此,如果您在 childView 中并需要致电您的父母,您将有一个频道可以这样做。
在你的 MainViewController.h 设置它像这样:
#import <UIKit/UIKit.h>
//This is our delegate
@protocol TalkToParentDelegate <NSObject>
//This is our delegate method
- (void)helloParent;
@end
@interface MainViewController : UIViewController <TalkToParentDelegate>
...
..
@end
在您的 MainViewController.m 中确保添加委托方法。
- (void)helloParent {
NSLog(@"Hello child, let me do something here");
}
在您的 ChildViewController.h 中设置它,如下所示:
#import <UIKit/UIKit.h>
//Add header of class where protocol was defined
#import "MainViewController.h"
@interface ChildViewController : UIViewController
//Create a property we can set to reference back to our parent
@property (strong, nonatomic) id <TalkToParentDelegate> delegate;
@end
现在,在您的 MainViewController.m 中,每当您展示 ChildViewController 时,请执行以下操作:
ChildViewController *child = [[ChildViewController alloc]...];
//Set the delegate reference to parent
child.delegate = self;
//present the view
最后但并非最不重要的一点是,当您在孩子中时,您可以像这样调用父级(MainViewController)上的方法:
[self.delegate helloParent];
因此,您可以使用以下两种方法。
但是,我想指出,您可以将它们一起使用。假设您有一个 UINavigationController 但仍然需要一个孩子与它的父母交谈,您可以设置一个委托,这样就可以了。