2011-05-29 51 views
0

像许多其他人一样,我今天开始编写一个实验代码,我将拥有两个视图控制器并能够在它们之间切换。我得到这个工作使用导航控制器,但我有一个关于实现的问题。使用导航控制器推送和弹出ViewControllers:实现

在我的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的构件等 。
能够在一个 位置定义所有视图控制器,最好是应用程序委托,这将是很好的。这可能吗?

回答

0

为了解决这个问题,可以创建一个回调类型的方法,它使用将向视图控制器发送请求的类的委托。最好是通过代码解释...

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以允许创建。

相关问题