iOS: смущен удалением из SuperSuperview и переключением представлений - PullRequest
3 голосов
/ 06 июля 2011

Новичок в разработке для iPhone, но мне дали первый большой проект, и я немного застрял.

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

То, как я подошел к этому, это начать с UIViewController с кнопкой, которую я подключил, но когда вы нажимаете на кнопку, и я делаю:

[self.view removeFromSuperview];

UIViewController *newView = [[UIViewController alloc] initWithNibName:@"Dashboard" bundle:nil];

[self.view addSubview:newView.view];

второй вид не загружается. Я просто получаю пустой экран. Нужно ли ссылаться в первом контроллере на второй?

Кроме того, я правильно подхожу к этому? Пока я удаляю FromSuperview, смогу ли я загружать навигационные контроллеры нажатием кнопки?

Извините, если это не слишком ясно, я пролистал книги и множество веб-сайтов, но, похоже, не смог обойти это.

Спасибо

Ответы [ 6 ]

3 голосов
/ 06 июля 2011

Здесь нет ничего с новым представлением, скорее проблема с текущим представлением.Вы удалили self.view из супер просмотра.

[self.view removeFromSuperview];

Поэтому все, что добавлено в self.view, не будет отображаться, так как само self.view удалено.

1 голос
/ 28 февраля 2014

Представляя дочерний контроллер / представление от родительского контроллера, вы должны рассмотреть возможность использования presentViewController. В конце концов, используйте dismissViewControllerAnimated, если хотите, чтобы ребенок исчез, а родитель появился снова.

В родительском контроллере представления:

ChildViewController * child = [[ChildViewController alloc] init];
[self presentViewController:child animation:YES completion:Nil];

В контроллере дочернего вида, т.е. в каком-то обработчике действий:

-(IBAction)close:(id)sender
{
    [self dismissViewControllerAnimated:YES completion:Nil];
}

ИМХО, вы также должны привыкнуть называть переменные экземпляра тем, из чего они создаются. В вашем примере вы называете экземпляр newView, когда это должно быть что-то вроде newViewController. Таким образом, вы убедитесь, что не смешиваете представления с контроллерами представления.

0 голосов
/ 06 июля 2011

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

Читайте о контроллерах представления здесь .

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

Так что лучшим подходом для начала было бы сделать что-то вроде этого;

[viewController1 presentModalViewController:viewController2 animated:YES];

Эта строка кода представит viewController2 с модальной анимацией по умолчанию (вставьте снизу). Если вам нужна другая анимация, вы можете заменить modalPresentationStyle на одну из констант в перечислении UIModalPresentationStyle на viewController1 (обратите внимание, что viewController1, а не viewController2).

Если вы хотите что-то более похожее на приложение «Часы», загляните в контроллер панели вкладок. Если вы хотите что-то более похожее на приложение Почта, загляните в контроллер навигации.

0 голосов
/ 06 июля 2011

Это удаляет self.view, что, скорее всего, уничтожит объект, так как других ссылок на него не будет:

[self.view removeFromSuperview];

Здесь вы создаете UIViewController и добавляете его представление к self.view, что, вероятно, не то, что вам нужно:

UIViewController *newView = [[UIViewController alloc] initWithNibName:@"Dashboard" bundle:nil];

[self.view addSubview:newView.view];

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

0 голосов
/ 06 июля 2011

Ваша третья строка добавляет newView как подпредставление self.view, но вы только что удалили self.view из его суперпредставления.

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

0 голосов
/ 06 июля 2011
[self.view removeFromSuperview];

Вы удалили представление из суперпредставления

[self.view addSubview:newView.view];

Но вы добавляете новое представление в то же представление, которое вы только что удалили из суперпредставления. Это нигде не отображается.

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