iPhone viewWillAppear не стреляет - PullRequest
       81

iPhone viewWillAppear не стреляет

114 голосов
/ 25 сентября 2008

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

Если я создам RootViewController и вызову addSubView на этом контроллере, я ожидаю, что добавленные представления будут подключены к событиям viewWillAppear.

Есть ли у кого-нибудь пример сложной программной иерархии представлений, которая успешно получает viewWillAppear событий на каждом уровне?

Состояние документов Apple:

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

Проблема в том, что они не описывают, как это сделать. Что значит «напрямую»? Как вы «косвенно» добавляете представление?

Я довольно новичок в Какао и iPhone, поэтому было бы неплохо, если бы были полезные примеры от Apple, кроме основного хрена Hello World.

Ответы [ 24 ]

2 голосов
/ 22 июня 2012

Я использую этот код для контроллеров push и pop view:

толчок:

[self.navigationController pushViewController:detaiViewController animated:YES];
[detailNewsViewController viewWillAppear:YES];

поп:

[[self.navigationController popViewControllerAnimated:YES] viewWillAppear:YES];

.. и у меня это прекрасно работает.

1 голос
/ 19 ноября 2010

На случай, если это кому-нибудь поможет. У меня была похожая проблема, когда мой ViewWillAppear не стреляет на UITableViewController. После долгих тренировок я понял, что проблема в том, что UINavigationController, который контролирует мой UITableView, не находится в корневом представлении. Как только я это исправлю, теперь он работает как чемпион.

1 голос
/ 07 октября 2008

Я не уверен на 100% в этом, но я думаю, что добавление представления к иерархии представлений напрямую означает вызов -addSubview: для представления контроллера представления (например, [viewController.view addSubview:anotherViewController.view]) вместо того, чтобы помещать новый контроллер представления в стек навигационного контроллера.

1 голос
/ 25 мая 2009

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

1 голос
/ 23 ноября 2010
[self.navigationController setDelegate:self];

Установите делегата для корневого контроллера представления.

1 голос
/ 21 сентября 2013

У меня просто была эта проблема, и мне потребовалось 3 полных часа (2 из которых - поиск в Google), чтобы ее исправить.

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

Надеюсь, что поможет

1 голос
/ 15 июня 2010

Я думаю, что они подразумевают «напрямую», подключая вещи точно так же, как это делает шаблон xcode «Navigation Application», который устанавливает UINavigationController в качестве единственного подпредставления UIWindow приложения.

Использование этого шаблона - единственный способ, с помощью которого я смог получить методы Will / Did / Appear / Disappear, вызываемые для объекта ViewControllers, после нажатия / выталкивания этих контроллеров в UINavigationController. Ни одно из других решений в ответах здесь не работало для меня, включая реализацию их в RootController и передачу их через (дочерний) NavigationController. Эти функции (будут / делались / появляются / исчезают) вызывались в моем RootController только при отображении / скрытии ВК высшего уровня, моих «логинов» и навигационных ВК, а не суб-ВК в контроллере навигации, поэтому у меня не было возможности "передать их" в Nav VC.

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

Также принципиально важно заставить его работать после того, как я сегодня несколько часов бьюсь головой об этой проблеме. Будем весьма благодарны за любые фрагменты рабочего кода, использующие пользовательский RootController и дочерний VC для навигации.

1 голос
/ 20 декабря 2018

для Свифта. Сначала создайте протокол для вызова того, что вы хотели вызвать в viewWillAppear

protocol MyViewWillAppearProtocol{func myViewWillAppear()}

Во-вторых, создайте класс

class ForceUpdateOnViewAppear: NSObject, UINavigationControllerDelegate {
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool){
    if let updatedCntllr: MyViewWillAppearProtocol = viewController as? MyViewWillAppearProtocol{
        updatedCntllr.myViewWillAppear()
    }
}

}

В-третьих, сделайте экземпляр ForceUpdateOnViewAppear членом соответствующего класса, который имеет доступ к контроллеру навигации и существует, пока существует контроллер навигации. Это может быть, например, контроллер корневого представления контроллера навигации или класс, который его создает или представляет. Затем назначьте экземпляр ForceUpdateOnViewAppear свойству делегата контроллера навигации как можно раньше.

0 голосов
/ 21 февраля 2019

ViewWillAppear - это метод переопределения класса UIViewController, поэтому добавление subView не вызовет viewWillAppear, но когда вы представляете, push, pop, show, setFront или popToRootViewController из viewController, тогда вызывается viewWillAppear для представленного viewController.

0 голосов
/ 21 февраля 2019

Я создал класс, который решает эту проблему. Просто установите его в качестве делегата вашего контроллера навигации и внедрите простой один или два метода в вашем контроллере представления - которые будут вызываться, когда представление будет показано или было показано через NavigationController

Вот ГИСТ, показывающий код

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