Невозможно изменить UILabel.text более одного раза при переключении на подробный вид

У меня есть navController и tableViewController, настроенные таким образом, что выбор строки таблицы будет отображать подробное представление в стеке navController и отображать подробную информацию о выбранной строке. В подробном представлении я использую один UILabel для отображения информации и устанавливаю значение свойства text метки в viewDidLoad контроллера подробного представления.

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

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

Может кто-нибудь объяснить мне, что здесь происходит?

Спасибо!


person skantner    schedule 07.08.2009    source источник


Ответы (1)


-viewDidLoad вызывается только тогда, когда... ну, когда представление загружено. То есть, когда он создается в памяти, что является первым разом, когда вы создаете контроллер представления. Вместо этого любые входные данные на основе настроек должны выполняться в -viewWillAppear:, который вызывается каждый раз перед тем, как вы нажмете его на навигационный контроллер.

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

- (void) tableView:(TableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UIViewController *screen = [[MyNewViewController alloc] initWithData:[data objectAtIndex:indexPath.row]];
    [self.navigationController pushViewController:screen animated:YES];
    [screen release];
}

Основная идея, однако, заключается в том, что настройка представления на основе данных, которые могут меняться каждый раз, когда вы видите представление, должна выполняться в -viewWillAppear:. Настройка представления дальше, чем вы можете сделать в Interface Builder, изменение вещей, которые не изменятся независимо от того, какие данные вы просматриваете, должно выполняться в -viewDidLoad

person Ed Marty    schedule 07.08.2009
comment
Эд, Большое спасибо. Это имеет смысл, и мой код теперь работает, И я понимаю, почему! - person skantner; 07.08.2009