0

像许多其他人一样,我今天开始编写一个实验,我将有两个视图控制器并能够在它们之间切换。我使用导航控制器让它工作,但我对实现有疑问。

在我的 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 的成员,等等。不管我想推入堆栈的多少视图控制器。
能够在一个地方定义所有视图控制器会很好,最好是应用程序委托。这可能吗?

4

1 回答 1

0

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

RootViewController.h

#import "RootInterfaceView.h"
// all the other VC imports here too
@interface RootViewController : UIViewController <RootInterfaceViewDelegate>
{
    RootInterfaceView *interface;
}

根视图控制器.m

-(void)rootInterfaceView: (RootInterfaceView*)rootInterfaceView didSelectItem:(NSUInteger)itemTag
{
    switch (itemTag)
    // then create the matching view controller
}

根接口视图.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

根接口视图.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 以允许创建它。

于 2011-05-29T00:59:14.167 回答