Требуется ли UINavigationController для выполнения pushViewController? - PullRequest
2 голосов
/ 20 сентября 2011

Я думаю, что ответ на мой вопрос "Да", но я просто хотел бы получить подтверждение от всех.

У меня есть UITableView, который должен "скользить" к другому UIViewController, когда я выбираю строку. Я делал это раньше с другими приложениями (и они включили UINavigationController, хотя и в UITabView).

Так что мне интересно: Требуется ли UINavigationController для использования self.navigationController pushViewController?

Если это так (что опять-таки я подозреваю, что это правда), где я должен определить UINavigationController? В AppDelegate? В основной / основной UIViewController?

Ответы [ 2 ]

4 голосов
/ 20 сентября 2011

Да, вам понадобится UINavigationController, чтобы сделать pushViewController. Тем не менее, нет ни одного места, где вы должны определить его. Если каждый контроллер представления в вашем приложении является частью одного UINavigationController, то имеет смысл поместить его в делегат приложения. Однако вы можете в любое время выделить и использовать контроллер представления. (Обратите внимание, что это подкласс UIViewController.) Вы также можете иметь несколько UINavigationControllers в своем приложении (что обычно, например, если у вас есть панель вкладок). Таким образом, вы можете создавать UINavigationControllers в любое время.

Если вы ищете альтернативные способы представления других контроллеров представления, у вас есть несколько других вариантов. Например,

- (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated

позволит вам перейти от одного контроллера представления к другому контроллеру представления и может использоваться без UINavigationController. Но я думаю, что навигационный контроллер очень часто является лучшим способом перехода от одного контроллера представления к другому.

3 голосов
/ 20 сентября 2011

Краткий ответ: Да.

UINavigationController был разработан с целью управления и анимации стека контроллеров представления на экране и за его пределами (в сочетании с несколькими другими элементами интерфейса, такими как панель навигацииили панель инструментов).Традиционно UINavigationControllers строго удерживаются и инициализируются делегатом приложения, так как они считаются корневым объектом высшего приоритета.Пример класса, показывающий правильное использование UINavigationController, может выглядеть следующим образом:

#import <UIKit/UIKit.h>

@interface CFIExampleAppDelegate : NSResponder <UIApplicationDelegate>

@property (nonatomic, strong) UIWindow *window;
@property (nonatomic, strong) UINavigationController *navigationController;

@end

@implementation CFIExampleAppDelegate

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc]initWithFrame:UIScreen.mainScreen.bounds];
    self.navigationController = [[UINavigationController alloc]initWithRootViewController:/*Some Controller Instance*/];
    self.window.rootViewController = self.navigationController;
    [self.window makeKeyAndVisible];

    return YES;
}

@end

Длинный ответ, как всегда, является Нет.

UINavigationController может быть тривиально переопределён (и этоимеет, много раз) с большим эффектом.Это так же просто, как создать подкласс UIViewController и использовать какой-либо стек (например, NSMutableArray).

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