Как мог UIVIew знать, что его ребенок покончил с собой - PullRequest
0 голосов
/ 15 сентября 2011

У меня быстрый вопрос:

View Controller X добавил вспомогательное представление: View Controller Y.

Y имеет кнопку «выход».При нажатии кнопки она удаляет свой вид из иерархии представлений X.

Но я обнаружил, что метод viewDidUnload Y не вызывается и его память не может быть освобождена.Как мог Y выпустить себя должным образом, или как X мог знать, что Y ушел?

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

Ответы [ 4 ]

0 голосов
/ 18 сентября 2011

У вас не должно быть 2 UIViewControllers на экране одновременно. Существует целый ряд проблем, связанных с этим, и это не то, как они предназначены для использования.

Один UIViewController должен управлять всеми подпредставлениями, связанными с одним экраном. Если вы хотите «дочерний» вид, подкласс UIView и добавить его как подпредставление.

Чтобы можно было легко переключаться между контроллерами представлений, добавьте UINavigationController в качестве корневого контроллера представлений и через него используйте контроллеры представления push / pop. Затем вы можете очень легко менять экраны. Помните - вы можете отключить навигационную панель и / или анимацию, у вас нет визуальной индикации того, что ваше приложение использует контроллер навигации, но в полной мере используется его способность управлять стеком представлений и обеспечивать отправку всех правильных уведомлений каждому контроллеру представления. как он загружается / появляется / исчезает / выгружается.

Если вы привыкли создавать каждое приложение с UINavigationController в качестве контроллера корневого представления, все становится очень просто.

0 голосов
/ 15 сентября 2011

Как вы добавили View Controller Y в View Controller X путем кодирования ...

    [viewX.view addSubView:viewY.view];

Итак, метод viewDidLoad выполнять не будет.А что касается управления памятью, вы можете кодировать его в viewX.m, то есть после нажатия «quit» ...

    [viewY removeFromSuperView];
    [viewY released];
0 голосов
/ 15 сентября 2011

Если вам нужно знать только, когда подпредставление было удалено из родительского представления, реализуйте didAddSubview: и / или willRemoveSubview:. ( см. Здесь в документации )

Если вы хотите освободить viewController при удалении представления, вам нужно ... отпустить viewController при удалении представления: [viewController.view removeFromSuperview]; [viewController release]; viewController = nil;

Метод viewDidUnload вызывается только тогда, когда iOSW выдает memoryWarning, и тогда ViewController автоматически выгружает свое представление (если оно не на экране, например ViewController не является верхним из стека NavCtrl, поэтому его представление не отображается), чтобы освободить часть памяти (а затем повторно загрузить представление из XIB и вызвать viewDidLoad, когда потребуется перезагрузить представление, чтобы отобразить его снова).

0 голосов
/ 15 сентября 2011

То есть вы хотите, чтобы контроллер представления Y очищался при закрытии его представления? До iOS5 не было ничего удивительного в том, чтобы поддерживать более одного UIViewController на экране одновременно, так что вы в основном знаете, как совершать звонки самостоятельно. Вы могли бы уведомить X, когда Y закрыт (вы могли бы использовать NSNotificationCenter или делегата), и X установил бы представление Y на nil, что вызвало бы вызов метода viewDidUnload в нем. Кроме того, вы можете даже освободить контроллер представления Y, который будет освобождать каждый экземпляр, который у него есть (вместе с самим представлением), если вы не собираетесь показывать его снова.

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