Как использовать несколько пользовательских контроллеров представления с контроллером навигации? - PullRequest
0 голосов
/ 04 сентября 2011

По сути, у меня есть два контроллера вида внутри MainWindow.xib, которые можно просмотреть, нажав кнопку панели в моем контроллере навигации. Я хотел, чтобы эти два контроллера представления были отделены от MainWindow.xib с их собственными заголовочными файлами, файлами реализации и xib, и в них все же должен был работать Navigation Controller внутри MainWindow.xib.

Чтобы лучше понять это, ознакомьтесь с кодами ниже:

Большое спасибо!

TestAppDelegate.h

#import <UIKit/UIKit.h>

    @interface TestAppDelegate : NSObject <UIApplicationDelegate>
    {
        //Navigation Controller
        IBOutlet UINavigationController *navigationController;


        //View Controllers
        UIViewController *viewController;
        UIViewController *viewController2;
        UIViewController *viewController3;

    }

    @property (nonatomic, retain) IBOutlet UIWindow *window;

    //Navigation Controller
    @property (nonatomic, retain) IBOutlet UINavigationController *navigationController;


    //View Controllers
    @property (nonatomic, retain) IBOutlet UIViewController *viewController;
    @property (nonatomic, retain) IBOutlet UIViewController *viewController2;
    @property (nonatomic, retain) IBOutlet UIViewController *viewController3;


    - (IBAction)next;
    - (IBAction)next2;


    @end

TestAppDelegate.m

#import "TestAppDelegate.h"

@implementation TestAppDelegate

@synthesize window = _window;

//Navigation Controller
@synthesize navigationController;

//View Controllers
@synthesize viewController;
@synthesize viewController2;
@synthesize viewController3;


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.

    //Navigation Controller
    [self.window addSubview:[navigationController view]];
    [self.window makeKeyAndVisible];
    return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application
{

}

- (void)applicationDidEnterBackground:(UIApplication *)application
{

}

- (void)applicationWillEnterForeground:(UIApplication *)application
{

}

- (void)applicationDidBecomeActive:(UIApplication *)application
{

}

- (void)applicationWillTerminate:(UIApplication *)application
{

}

- (void)dealloc
{

    [viewController release];
    [viewController2 release];
    [viewController3 release];

    [navigationController release];
    [_window release];
    [super dealloc];
}


- (IBAction)next {
    [navigationController pushViewController:viewController2 animated:YES];
}


- (IBAction)next2 {
    [navigationController pushViewController:viewController3 animated:YES];
}


@end

Внутри MainWindow.xib:

http://i52.tinypic.com/10xa45f.png

Ответы [ 2 ]

1 голос
/ 04 сентября 2011

Я обычно не прикасаюсь MainWindow.xib.Я предлагаю следующее:

  1. Создайте MainController, который будет вашим MainView, который подкласс UIViewController, перейдя к File > New > New File.Это создаст файл .h / .m и nib для каждого ViewController.Там добавьте любой интерфейс, который вы хотите для своего приложения.Например, добавьте две кнопки и подключите эти кнопки к IBActions в главном контроллере.Это должно быть объявлено и реализовано в вашем MainController.{h/m}, соответственно.

  2. После этого создайте еще два ViewController, таким же образом.

  3. Тело этих IBActions должно создать экземпляр ваших ViewControllers, а затем выдвинуть их.

Это будет выглядеть примерно так:

YourViewController *yvc = [[YourViewController alloc] init];
[self.navigationController pushViewController:yvc animated:YES];
[yvc release];

Наконец, вы должны нажать MainController в вашем AppDelegate и добавить ваш NavigationController в представление.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
     MainViewController *mvc = [[MainViewController alloc] init];
     UINavigationController *unvc = [[UINavigationController alloc] init];
     [unvc pushViewController:mvc animated:NO];
     [mvc release];
     [self.window addSubview:unvc.view];
     [self.window makeKeyAndVisible];
     return YES;
 }
1 голос
/ 04 сентября 2011

Установите свойство "class" в Интерфейсном Разработчике (третья вкладка в инспекторе, " Пользовательский класс ") на имя пользовательского класса, который вы планируете использовать, а затем введите имя XIB-файл, из которого вы хотите загрузить данные в «NIB Name» (четвертая вкладка).

Код, который вы используете для нажатия на viewController, в порядке. Удостоверьтесь, что никогда случайно не освободите ни один из двух UIViewController.

Говоря об этом, имейте в виду, что этот подход сохраняет ViewControllers всегда в памяти, даже когда он не используется. Другой подход состоит в том, чтобы полностью удалить IBOutlets для двух ViewControllers и сделать что-то вроде:

- (IBAction)next
{
    MyCustomViewController *customViewController = [[MyCustomViewController alloc] initWithNibName:<#NibName or nil#> bundle:[NSBundle mainBundle]]; 
    [navigationController pushViewController:customViewController animated:YES];
    [customViewController release];
}

Это создает объект, когда это необходимо (если я правильно помню, элементы пользовательского интерфейса из xib где-то кэшируются, так что это может быть неактуально [цитата нужна]). Просто кое-что, что нужно иметь в виду, в зависимости от частоты использования ваших двух контроллеров ViewController.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...