2015-09-15 5 views
1

Я пытаюсь понять, что сценарий вызова метода для просмотра сделал/появится и исчезнет.Нужно ли называть супер в видуWillAppear?

То, что я сделал, это выбор ячейки таблицы (высвечивание в сером цвете), переход к подробному представлению и возврат назад и снятие выделения с выбранной строки (удаление выделенного серого цвета ячейки).

Вот мои методы:

-(void)viewDidAppear:(BOOL)animated { 
    DLog(@"%@ did appear", self); 
    [super viewDidAppear:animated]; 

    if (_isPushed) { 
     [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES]; 
     _isPushed=NO; 
    } 
} 

-(void)viewWillAppear:(BOOL)animated { 
    DLog(@"%@ will appear", self); 
    [super viewWillAppear:animated]; //If I remove this super call , then it works fine and there is no delay in deselecting the table cell 
} 

-(void)viewWillDisappear:(BOOL)animated { 
    DLog(@"%@ will disappear", self); 
    [super viewWillDisappear:animated]; 
} 

-(void)viewDidDisappear:(BOOL)animated { 
    [super viewDidDisappear:animated]; 
    _isPushed=YES; 
} 

Так что, когда я ставлю останова поток выглядит следующим образом:

без супер вызова:

, выдвигая на новый ВК:

current viewWillDisappear //makes sense 
new viewWillAppear   //makes sense 
current viewDidAppear   // doesnt make sense , y this should get called as the view is already appeared? 
current viewWillDisappear  // make sense 
current viewDidDisappear  //make sense 
new viewDidAppear   //make sense 

, возвращаясь из толкаемого ВКА:

current viewWillDisappear 
new viewDidDisappear 
current viewDidDisappear 
new viewDidAppear 

с супер вызовом:

, выдвигая на новый ВК:

current viewWillDisappear 
new viewWillAppear 
current viewDidAppear 
current viewWillDisappear 
current viewDidDisappear 
new viewDidAppear 

, идя назад от толкаемого VC :

current viewWillDisappear 
new viewDidDisappear 
current viewDidDisappear 
new viewDidAppear 

Поток практически такой же, как я использую супер-вызов или нет. Но проблема, с которой я столкнулся, заключается в том, что, когда я использую супервызов в viewWillAppear, есть задержка (около> 1 секунда) при удалении ячейки.

Если я не использую супер вызов в viewWillAppear, нет никакой задержки и клетка deselcting (около < 0,5 секунды)

Я не уверен, использовать супер вызов или нет.

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

+0

Если вы не добавляете какой-либо код, не беспокойтесь при добавлении метода. Шаблоны Apple добавляют потенциально полезные ["Boilerplate"] (https://en.wikipedia.org/wiki/Boilerplate_code) методы, если они вам не нужны, то есть не нужно добавлять к ним код, удалять их. В этом примере вы можете просто удалить методы: 'viewWillAppear' и' viewWillDisappear'. – zaph

ответ

1

Обычно да, звоните super. Когда я забыл, в навигационных контроллерах я видел странные вещи.

В этом случае, если у вас есть UITableViewController, попробуйте использовать его флаг clearsSelectionOnViewWillAppear, чтобы удалить выделение для вас.

+0

Я работаю в организации, и они не используют tableviewcontrollers. Повсюду это просто табличка !!!! –

+0

Попробуйте поставить снимок в viewWillAppear вместо viewDidAppear. –

+0

в этом случае выбор сразу же удаляется. –

6

Да, documentation утверждает, вы должны:

Обсуждение

Этот метод вызывается перед вид приемника составляет около быть добавлены к иерархии представлений и до того, как анимация сконфигурировано для отображения вида. Вы можете переопределить этот метод на выполнение пользовательских задач, связанных с отображением вида.Например, вы можете использовать этот метод для изменения ориентации или стиля строки состояния для согласования с ориентацией или стилем представления . Если вы переопределяете этот метод, вы должны позвонить super по адресу . Некоторые моменты в вашей реализации.

+0

Я смущен в имени переопределения. Как вы можете видеть, viewWillAppear не содержит никакого кода, так что в чем смысл переопределять этот метод? –

+0

Я назвал super in viewDidAppear, потому что я написал в нем некоторый код, и его нужно переоценить !!! –

+1

Это означает, что вы переопределяете реализацию базового класса, как вы это делали. – trojanfoe