使用导航控制器推送和弹出视图控制器:实现
Posted
技术标签:
【中文标题】使用导航控制器推送和弹出视图控制器:实现【英文标题】:Pushing and Popping ViewControllers using a Navigation Controller: Implementation 【发布时间】:2011-05-29 00:02:29 【问题描述】:像许多其他人一样,我今天开始编写一个实验代码,我将有两个视图控制器并能够在它们之间切换。我使用导航控制器让它工作,但我对实现有疑问。
在我的 TwoViewsAppDelegate 中,我定义了导航控制器和 rootViewController。
@interface TwoViewsAppDelegate : NSObject <UIApplicationDelegate>
UIWindow *window;
UINavigationController *navigationController;
RootViewController *rootViewController;
并将它们设置如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
rootViewController = [[RootViewController alloc] init];
navigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
[window setRootViewController:navigationController];
[self.window makeKeyAndVisible];
return YES;
然后在我的 rootViewController 中,我定义了我的 level2ViewController 我要切换到,我要按下一个按钮来制作 切换发生:
@interface RootViewController : UIViewController
UIButton *theButton;
Level2ViewController *level2ViewController;
这是在 RootViewController.m 中按下按钮的响应:
-(void)level1ButtonPressed:(id)sender
if (level2ViewController == nil)
level2ViewController = [[Level2ViewController alloc] init];
[self.navigationController pushViewController:level2ViewController animated:YES];
问题是如果有一个level3ViewController, 它必须被定义为 level2ViewController 等的成员。 不管有多少视图控制器我都想推入堆栈。 能够在一个中定义所有视图控制器会很好 地方,最好是应用程序代表。这可能吗?
【问题讨论】:
【参考方案1】:要解决这个问题,您可以创建一个回调类型的方法,该方法使用将向视图控制器发送请求的类的委托。最好通过代码来解释...
RootViewController.h
#import "RootInterfaceView.h"
// all the other VC imports here too
@interface RootViewController : UIViewController <RootInterfaceViewDelegate>
RootInterfaceView *interface;
RootViewController.m
-(void)rootInterfaceView: (RootInterfaceView*)rootInterfaceView didSelectItem:(NSUInteger)itemTag
switch (itemTag)
// then create the matching view controller
RootInterfaceView.h
// imports here if required
@protocol RootInterfaceViewDelegate;
@interface RootInterfaceView : UIView <RootInterfaceItemViewDelegate>
id <RootInterfaceViewDelegate> delegate;
@property (nonatomic, assign) id delegate;
@end
@protocol RootInterfaceViewDelegate <NSObject>
@optional
-(void)rootInterfaceView: (RootInterfaceView*)rootInterfaceView didSelectItem:(NSUInteger)itemTag;
@end
RootInterfaceView.m
// remember to synthesize the delegate
-(void)rootInterfaceItemSelected: (RootInterfaceItemView*)rootInterfaceItemView
NSUInteger theTag = rootInterfaceItemView.tag;
if ([self.delegate respondsToSelector:@selector(rootInterfaceView:didSelectItem:)])
[self.delegate rootInterfaceView:self didSelectItem:theTag];
或者,如果级别 2 的唯一选项是返回根目录/弹出一个 VC 或推送控制器 3,那么级别 2 可以导入 3 以允许创建它。
【讨论】:
以上是关于使用导航控制器推送和弹出视图控制器:实现的主要内容,如果未能解决你的问题,请参考以下文章
TabBarController + NavigationController:推送和弹出问题