Загрузка пользовательского ViewController с данными - PullRequest
2 голосов
/ 04 декабря 2011

У меня есть UITableView, который загружает через свой навигационный контроллер новый viewcontroller.Этот код входит в метод tableView: didSelectRowAtIndexPath:

ConcertDetailViewController *detailVC = [[ConcertDetailViewController alloc] initWithNibName:@"ConcertDetailViewController" bundle:nil];

У UITableView есть модель, я хочу отправить элемент этой модели во вновь созданный ViewController.

detailVC.aProd = [_prod objectAtIndex:indexPath.row];

Когда значение установлено, я хочу, чтобы detailVC рисовал данные на экране.Я думал, что пользовательский сеттер, перезаписывающий тот, что генерируется @synthesize, будет работать.

-(void)setaProd:(NSMutableDictionary *)aProd {
_aProd = aProd;
[self displayAProd];
}

displayAProd просто берет значения в aProd и выводит их на экран, или, скорее, я устанавливаю какое-то значение розетки, созданной в моем файле пера.

self.prodNameLbl.text = [_aProd objectForKey:@"name"];

Ничего особенного в этом нет.Но это просто не работает.Я понял почему, я думаю.Это потому, что сеттер выполняется намного быстрее, загружая весь вид в память.Если я поставлю self.prodNameLbl.text = @ "что-то";в методе viewDidLoad он отображает правильное значение в метке.Быстрый обходной путь - увидеть, установлен ли _concerts, и оттуда вызвать displayAProd.Здесь я сомневаюсь, что это хороший способ загрузить вид.Что делать, если пользовательский установщик занимает больше времени, чтобы выполнить загрузку представления.Проверка того, установлены ли _concerts, будет ложной, и ничего не будет отображаться.Или это просто невозможно?

Или, может быть, есть лучший шаблон для загрузки представлений и передачи им данных для отображения.

Спасибо заранее, Джонас.

1 Ответ

0 голосов
/ 04 декабря 2011

Проблема в том, что когда вы загружаете контроллер представления из NIB, IBOutlets не будут подключены к вашей UILabel и другим подобным свойствам во время вызова initWithNibName.

Вам нужно дождаться вызова viewDidLoad на detailVC и вызвать [self displayAProd] оттуда. На этом этапе соединения будут выполнены.

Сделайте быстрый тест. Поместите точку останова в ваш метод didSelectRowAtIndexPath и, после инициализации detailVC, проверьте, является ли prodNameLbl нулевым или нет.

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