Нужна помощь с подробным представлением таблицы. Кажется, я не могу записать значения в текстовое свойство UILabel? - PullRequest
0 голосов
/ 07 июля 2010

У меня есть установка 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];
}

Мне нравится, что код работает, но мне бы очень хотелось понять, что происходило и происходит.Кто-нибудь может предложить дополнительную информацию здесь?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 07 июля 2010

Ход

[self.navigationController pushViewController:self.detailView animated:YES]; 

до последней строки.

0 голосов
/ 07 июля 2010

Вы можете попробовать сделать:

NSString *strText = [NSString stringWithFormat:@"%@",[[dict objectForKey:@"PRICE"] stringValue]];
self.detailView.thePrice.text = [NSString stringWithFormat:@"%@",strText];

Убедитесь, что strText содержит ожидаемое значение и не равно нулю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...