Это правильный способ добавления / удаления просмотров? - PullRequest
0 голосов
/ 05 февраля 2012

Допустим, у меня есть 4 контроллера представления (назовите их FirstView, SecondView, ThirdView, FourthView), которые создаются программно и все находятся в отдельных файлах:

В методе AppDelegate.m didFinishLaunchingWithOptions у меня есть эти строкикод

self.rootViewController = [[rootViewController alloc]initWithNibName:@"rootViewController" bundle:nil];
self.window.rootViewController = self.rootViewController;

В методе loadView rootViewController.m у меня есть

self.view = [[UIView alloc]initWithFrame:[UIScreen mainScreen].applicationFrame];
self.firstView = [[FirstView alloc]init];
[self.view addSubview:self.firstView.view]; 

Этот код работает нормально - отображается первый вид.

Давайте продолжим

В методе FirstView.m switchViews

ПРИМЕЧАНИЕ. См. Комментарии в коде

 self.secondView = [[SecondView alloc] initWithNibName:@"SecondView" bundle:nil];


// I think here secondView is added to rootViewController - right ?
[self.view.superview addSubview:self.secondView.view];

// Here first view is removed from rootViewController - right ?
[self.view removeFromSuperview];

Вот как я могу добавлять / удалять представления.

Является ли этот подход правильным?Можете ли вы порекомендовать лучшее решение?

Я читал об UINavigationController, но не думаю, что в этом случае это может быть решением.

Ответы [ 2 ]

2 голосов
/ 05 февраля 2012

Вы говорите:

У меня есть 4 вида (назовите их FirstView ...

Тогда вы говорите:

[self.view addSubview:self.firstView.view]; 

Что заставляет меня думать, что FirstView на самом деле не UIView - как вы утверждаете. Вместо этого это, вероятно, UIViewController - совсем другой зверь.

Если мои подозрения верны - значит, вы "не в курсе", так сказать.

Выходя за пределы этого, к вашему примеру кода:

self.secondView = [[SecondView alloc] initWithNibName:@"SecondView" bundle:nil];

// I think here secondView is added to rootViewController - right ?
[self.view.superview addSubview:self.secondView.view];

// Here first view is removed from rootViewController - right ?
[self.view removeFromSuperview];

Это определенно не очень хорошая идея. И вот почему:

Во-первых: ваш контроллер представления явно «не знает» ничего о суперпредставлении, которое вы так случайно вставляете и удаляете подпредставления в / из - поэтому он не должен этого делать. В качестве альтернативы вы можете создать свой собственный вид и вставить / удалить подпредставления из этого, что будет не только вполне приемлемым, но и обычной практикой.

Второе: если это на самом деле UIViewController s, как я думаю, - тогда вы неправильно обрабатываете подключение их к цепочке событий UIViewController - что означает методы в этих подклассах, такие как viewDidAppear: или viewDidUnload не сработает.

0 голосов
/ 05 февраля 2012

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

Если ваши представления должны отображаться только временно, вы также можете использовать ModalПосмотреть контроллеры.Пример контроллеров Modal View можно найти здесь .

Если вы этого еще не сделали, ознакомьтесь с Руководством по программированию контроллера представления от Apple.

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