0

他の多くの人と同じように、私は今日、2 つのビュー コントローラーを持ち、それらを切り替えることができる実験のコーディングを開始しました。ナビゲーションコントローラーを使用してこれを機能させましたが、実装について質問があります。

私の 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 か所で、できればアプリのデリゲートで定義できると便利です。これは可能ですか?

4

1 に答える 1

0

これを解決するには、View Controller のリクエストを送信するクラスのデリゲートを使用するコールバック タイプのメソッドを作成します。コードで最もよく説明されています...

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 からの唯一のオプションがルートに戻るか、1 つの VC をポップするか、コントローラー 3 をプッシュするかのいずれかである場合、レベル 2 が 3 をインポートして作成できるようにしても問題ありません。

于 2011-05-29T00:59:14.167 に答える