Нажатие и выталкивание ViewControllers с помощью контроллера навигации: реализация - PullRequest
0 голосов
/ 29 мая 2011

Как и многие другие, сегодня я начал программировать эксперимент, в котором у меня было бы два контроллера представления и я мог бы переключаться между ними. Я получил это, чтобы работать с помощью контроллера навигации, но у меня есть вопрос о реализации.

В моем 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 я определяю уровень levelViewView Controller, который я я собираюсь переключиться на, и кнопку, которую я собираюсь нажать, чтобы сделать Переключение происходит:

@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];
}

Проблема в том, что если будет уровень 3ViewController, он должен быть определен как член level2ViewController и т. д. как бы ни было много контроллеров представления, я хотел бы поместить их в стек.
Было бы неплохо иметь возможность определить все контроллеры представления в одном место, желательно приложение делегат. Это возможно?

1 Ответ

0 голосов
/ 29 мая 2011

Чтобы решить эту проблему, вы можете создать метод типа обратного вызова, который использует делегат класса, который будет отправлять запросы для контроллеров представления.Лучше всего объяснить с помощью кода ...

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, чтобы разрешитьдля его создания.

...