2012-07-03 2 views
0

Я провел часы, и я не могу понять это. У меня есть контроллер представления детали (UITableView), который запускается здесь:Superview is Nil после второго запуска контроллера просмотра

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    EventLocationDetailController *newDetailViewController = [[EventLocationDetailController alloc] initWithNibName:@"EventLocationDetailController" bundle:nil]; 
    self.eventDetailController = newDetailViewController; 
    [self.navigationController pushViewController:self.eventDetailController animated:YES]; 

    [newDetailViewController release]; 

} 

В контроллере представления подробно есть метод кнопки, которая вызывает метод ниже, чтобы отобразить слайд-в-выдвижные анимации, подтверждающие пользователь выбор:

-(void)confirmLastActionWithMessage:(NSString *)message { 

ConfirmActionViewController *newConfirmActionViewController = [[ConfirmActionViewController alloc] initWithNibName:@"ConfirmActionViewController" bundle:nil]; 
self.confirmActionViewController = newConfirmActionViewController; 
[newConfirmActionViewController release]; 

[[self.view superview] addSubview:self.confirmActionViewController.view]; 

}

метод протокола вызывается ConfirmActionViewController, указывающий, что анимация закончена.

-(void)didFinishConfirmDisplay:(UIView *)viewToRemoveFromSuperview { 

    [viewToRemoveFromSuperview removeFromSuperview]; 
} 

Это работает в первый раз, когда я нажимаю кнопку. Если я вытащу контроллер детали и верну его обратно в стек и снова нажму кнопку, ничего не произойдет, и супервизор контроллера детали равен нулю при каждом вызове метода после этого. Superview не ноль в методе viewWillAppear для подробного представления, только когда он получает метод confirmLastActionWithMessage. Между пользователем нет другого взаимодействия с пользователем. Как мне вернуть супервизор? У меня есть аналогичный код, который работает без анимации.

Я также заметил, что контроллер подробного представления не вызвал dealloc, когда выскочил из стека. Не знаю, где проблема.

Спасибо.

EDIT 1

OK. Я заменил строку addSubview следующим образом:

[self.view insertSubview: self.confirmActionViewController.view atIndex: 0];

и анимационный вид появился под одной из ячеек таблицы. Может ли одна из ячеек таблицы украсть супервизор?

+0

Что Вы будете выглядеть? В частности, добавили ли вы пользовательскую логику в свойства? – mydogisbox

+0

@property (неатомный, сохранить) ConfirmActionViewController * confirmActionViewController; –

+0

Реализация, а не декларация. У вас есть '@ synhesize' или что-то еще? – mydogisbox

ответ

0

Ну, я действительно не понимаю, почему вы должны добавить subview в супервизор. Почему бы не добавить его просто self.view

Я не могу быть в состоянии объяснить, почему нет SuperView но попробуйте либо добавив вид контроллера к self.view или

[[[[UIApplication sharedApplication] delegate] window] addSubview:yourview]; 

Это сделает вид на вершина всего.

+0

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

+0

Создайте новое перечисление с возможными случаями, для которых вам нужно рассчитать начальную точку для анимации, например, с помощью панели инструментов, без панели инструментов, с панелью навигации и т. Д.затем измените метод '- (void) confirmLastActionWithMessage: (NSString *) message', чтобы взять дополнительный параметр этого типа перечисления и вычислить начальную точку в блоке коммутатора. При вызове метода передайте аргумент по мере необходимости. Это сделает ваш код более портативным. – tGilani

 Смежные вопросы

  • Нет связанных вопросов^_^