2009-12-29 1 views
0

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

В настоящее время я выхожу из второго представления до его вызова. Кажется, что это работает, и второе представление повторно инициализируется. Однако не лучше ли совместить вторую точку зрения (само по себе после удаленияFromSuperview)?

В первый взгляд:

//show next view 
aView = nil; 
if(aView == nil) 
{ 
    aView = [[AView alloc] initWithNibName:@"aView" bundle:nil]; 
} 
[self.view addSubview: aView.view]; 

Нажмите кнопку Готово в AView

[self.view removeFromSuperview]; 

ответ

1

Метод removeFromSuperview автоматически освободит «aView.view», поэтому вы не должны отпускать aView в первом контроллере представления. Я думаю, вы указали AView *aView в главном файле, но вам это не нужно. Вы можете объявить AView в качестве локальной переменной, как это:

// go to second view 
SecViewController *sec = [[SecViewController alloc] initWithNibName:@"SecView" bundle:nil]; 
[self.view addSubview:sec.view]; 

// go back 
[self.view removeFromSuperview]; 
+0

Спасибо. Я удалил объявление файла заголовка, и он отлично работает. – 4thSpace

1

Сразу после

[self.view addSubview: aView.view]; 

Вы должны добавить:

[aView release]; 

Ваш подъярус сохранен в представлении контроллера вашего вида, поэтому его можно освободить.

+0

Это не работает. У меня есть соединение IBAction с кнопкой в ​​aView. Когда я нажимаю на него, я сразу получаю EXC_BAD_ACCESS. Точки останова в кнопке никогда не попадают. – 4thSpace

0

оба вышеупомянутых ответа - правильная теория того, как вы должны управлять памятью в объективе c.

согласно документации Dev:

http://developer.apple.com/iPhone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/instm/UIView/removeFromSuperview

callling removeFromSuperview будет на самом деле назвать выпуск для вас, так что вы все в порядке, я думаю.

+0

Нет - он не выпускается для вас. dealloc представления ребенка никогда не называется. Вместо просмотра, я должен сказать viewcontroller. – 4thSpace

1

Если вы ранее установили ваш ViewController к первому статусу ответчика (такие, как реагировать на события движения) ответчик цепи сохранит контроллер. Вы должны подать в отставку первого ответчика, чтобы полностью уничтожить контроллер.