У меня есть установка TableView в качестве моего «корневого контроллера представления» и контроллер подробного представления, называемый DetailController, чтобы позволить мне отображать подробное представление для того, что пользователь выбирает в основном представлении таблицы.Навигация работает правильно - когда я выбираю строку в моей таблице, экран сдвигается влево, и мне представляется мой подробный вид, но я не могу обновить свойства текста подробного представления UILabel.Как будто он просто игнорирует мои методы свойств UILable (см. Код ниже), так как он не дает мне никаких ошибок или предупреждений.
Я проверял, что у меня есть значения, которые мне нужны, когда я нажимаюМетод tableView: didSelectRowAtIndexPath:, но по какой-то причине я не могу обновить свойства текста UILabels детального представления.Используя NSLog, я вижу, что получаю значения и правильно передаю их UILabels.Однако в подробном представлении не отображаются переданные значения в его UILabels.
Странно то, что я МОГУ правильно установить свойство title подробного представления, но не свойства UILabel, что очень запутанно!
Вот мой код:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Navigation logic may go here. Create and push another view controller.
if (self.detailView == nil) {
DetailController *detail = [[DetailController alloc] initWithNibName:@"DetailController" bundle:nil];
self.detailView = detail;
[detail release];
}
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
NSDictionary *dict = [[NSDictionary alloc] initWithDictionary:[theList getItem:cell.textLabel.text]];
[self.detailView.theID setText:@"LOOK AT ME NOW!"];
self.detailView.thePrice.text = [[dict objectForKey:@"PRICE"] stringValue];
// Pass the selected object to the new view controller.
[self.navigationController pushViewController:self.detailView animated:YES];
NSString *newTitle = [[NSString alloc] initWithString: @"Viewing Attributes for: "];
newTitle = [newTitle stringByAppendingString:cell.textLabel.text];
self.detailView.title = newTitle;
[dict release];
[newTitle release];
}
Спасибо за любую помощь в этом!Я люблю это сообщество - вы, ребята, потрясающие!
Я нашел ответ!Я думаю ...
После долгих проб и ошибок я смог найти решение, но решение не имеет для меня никакого смысла и все еще оставляет мне вопросы.
Зигфридпредложил переместить мое сообщение «pushViewController» в конец метода, чтобы последние шесть строк моего кода были изменены на:
// Pass the selected object to the new view controller.
NSString *newTitle = [[NSString alloc] initWithString: @"Viewing Attributes for: "];
newTitle = [newTitle stringByAppendingString:cell.textLabel.text];
self.detailView.title = newTitle;
[dict release];
[newTitle release];
[self.navigationController pushViewController:self.detailView animated:YES];
}
Когда я переместил его в последнюю строку (как показано выше)моя программа вылетает с ошибкой EXC_BAD_ACCESS.Я до сих пор не понимаю, почему перемещение этой строки кода в конец моего метода привело к сбою программы?
Однако это заставило меня задуматься - я смог успешно изменить название нового подробного представления., но не свойства UILabel представления.Поэтому я переместил свой метод pushViewController обратно туда, где он был, а затем переместил мои методы для установки UILabels нового представления под методом pushViewController и BOOM!Все работало!Новое подробное представление выдвигалось, когда пользователь нажимал на строку в моей таблице, и все его свойства (title и UILabels) были установлены правильно.
Почему это работает?
Я помнючитая о том, как iPhone обрабатывает представления, что называется «ленивая загрузка» или «ленивая реализация»?Я думаю, это означает, что я не могу изменить свойства моего подробного вида, пока я его не «подтолкнул», то есть когда объект фактически создается в памяти и его свойства становятся доступными?
Если этоправильно, это как бы объясняет ошибку, которую я получал, когда я перемещал метод pushViewController в конец моего кода - я пытался изменить свойство title в представлении, которое не было создано.Однако это не совсем имеет смысла, потому что я пытался изменить свойства представления UILabel в моем исходном коде, что было до того, как представление было фактически передано, и программа не аварийно завершала работу?
Итак, мойкод, который работает в данный момент, выглядит следующим образом:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Navigation logic may go here. Create and push another view controller.
if (self.detailView == nil) {
DetailController *detail = [[DetailController alloc] initWithNibName:@"DetailController" bundle:nil];
self.detailView = detail;
[detail release];
}
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
NSDictionary *dict = [[NSDictionary alloc] initWithDictionary:[theList getItem:cell.textLabel.text]];
// Pass the selected object to the new view controller.
[self.navigationController pushViewController:self.detailView animated:YES];
// Moved the "set property" methods to happen after the detail view is pushed
[self.detailView.theID setText:@"LOOK AT ME NOW!"];
self.detailView.thePrice.text = [[dict objectForKey:@"PRICE"] stringValue];
NSString *newTitle = [[NSString alloc] initWithString: @"Viewing Attributes for: "];
newTitle = [newTitle stringByAppendingString:cell.textLabel.text];
self.detailView.title = newTitle;
[dict release];
[newTitle release];
}
Мне нравится, что код работает, но мне бы очень хотелось понять, что происходило и происходит.Кто-нибудь может предложить дополнительную информацию здесь?
Спасибо!