2013-02-24 2 views
0

У меня не было проблем после следующего учебника: http://www.raywenderlich.com/1797/how-to-create-a-simple-iphone-app-tutorial-part-1. По сути, в этом учебном пособии описано создание простого представления таблицы, заполненного данными из NSMutableArray, и последующего сверления в DetailView каждого элемента.Добавление NSMutableArray в TableView во второй вкладке из AppDelegate

Затем я попытался улучшить то, что у меня было, создав TabViewController и имея созданный Table View как «элемент табуляции 2» этого контроллера.

Это сломало автоматическое население таблицы.

Код, используемый для заполнения таблиц из AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 

    Person *person1 = [[Person alloc] initWithName:@"Monica" 
              balance:420 
             thumbImage:[UIImage imageNamed:@"01.jpg"] 
              fullImage:[UIImage imageNamed:@"01_t.jpg"]]; 
    Person *person2 = [[Person alloc] initWithName:@"Ross" 
              balance:630 
             thumbImage:[UIImage imageNamed:@"02.jpg"] 
              fullImage:[UIImage imageNamed:@"02_t.jpg"]]; 
    Person *person3 = [[Person alloc] initWithName:@"Rachel" 
              balance:420 
             thumbImage:[UIImage imageNamed:@"03.jpg"] 
              fullImage:[UIImage imageNamed:@"03_t.jpg"]]; 

    NSMutableArray *persons = [NSMutableArray arrayWithObjects:person1, person2, person3, nil]; 

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
    UIViewController *initialViewController = (UIViewController *)[storyboard instantiateViewControllerWithIdentifier:@"RootViewController"]; 
    self.window.rootViewController = initialViewController; 
    TableViewController * peopleTableViewController = [storyboard instantiateViewControllerWithIdentifier:@"PersonTableViewController"]; 
    [peopleTableViewController setPersons: persons]; 

    // Override point for customization after application launch. 
    return YES; 
} 

«человек» представляет собой массив экземпляров лица, которое является собственностью TableViewController. Ниже население таблицы на основе массиву "лиц из TableViewController.m:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    static NSString *CellIdentifier = @"PersonCell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 


    //For each person 
    Person *person = [self.persons objectAtIndex:indexPath.row]; 
     cell.textLabel.text = person.name; 
     cell.imageView.image = person.thumbImage; 
     cell.detailTextLabel.text = [person getPrice]; 

    return cell; 
} 

Наконец, раскадровка находится здесь: http://i.stack.imgur.com/9axs8.png

И просто повторно итерацию, это все компилируются нормально, но во время тестов таблица пуста после открытия вкладки # 2 (где контроллер табличного представления существует в соответствии с раскадрой). Это работало до того, как я добавил вкладки.

Я все еще очень новичок в Objective C, поэтому, пожалуйста, дайте мне знать, есть ли какая-либо другая информация, которую вы можете потребовать.

+0

Обратите внимание, что «человек» является NULL на TableViewController [viewDidLoad], но он правильно установлен, когда я проверяю в нижней части AppDelegate [didFinishLaunchingWithOptions] – fantom

+0

Не уверен, что это, так как я обычно не использовать '-instantiateViewControllerWithIdentifier' но, возможно, '-viewDidLoad' tableViewController вызывается до того, как вы установили' person' ivar на контроллер (т. е. в '-instantiate ...'). Это объясняет 'NULL'. Вы можете попробовать сделать '[tableView reloadData]' в '-viewWillAppear:' и посмотреть, поможет ли это. –

ответ

1

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

UITabBarController *tabVC = (UITabBarController *)self.window.rootViewController; 
    UINavigationController *nav = tabVC.viewControllers[1]; 
    TableViewController *peopleTableViewController = nav.topViewController; 
    [peopleTableViewController setPersons:persons]; 

Это должно работать, но я думаю, что было бы лучше, чтобы переместить создание объектов Person и лиц, массив для метода viewDidLoad контроллера табличного представления.

+0

Большое спасибо! Он работает сейчас! Я очень новичок в Objective C и не уклоняюсь от указателей с 3-4 лет назад, делая C немного, поэтому он немного подавляет попытку выяснить, указываю ли я на адреса или создание новых экземпляров! Главное изменение, по-видимому, было .viewControllers [1]. Я думал о том, чтобы идти по этому пути, но не был уверен, что он нарушил лучшие практики, напрямую ссылаясь на элемент №1 в массиве. Спасибо за подтверждение! – fantom

0

Я думаю, ваша проблема здесь:

Person *person = [self.persons objectAtIndex:indexPath.row]; 

Попробуйте поместить свой код в ViewDidLoad вместо AppDelegate и запустить его. (только для теста)

+0

Спасибо за ваш ответ, да, я согласен с тем, что я нарушаю лучшие практики, получая AppDelegate для создания массива. Я буду следить за тем, чтобы я сохранял какие-либо подобные элементы в правильных классах. Имея опыт работы на C, Java и PHP, я все еще изучаю этот сложный язык. Если вы знаете какой-либо материал, который охватывает лучшие практики, это было бы очень удобно! – fantom

+0

В то время как на эту тему, является ли общая практика создания пользовательского класса для каждого созданного View Controller? Я попробовал поиск по Google и довольно хорошо проверил SO, но краткое Да или Нет, похоже, не доступно. – fantom

+0

У меня есть хорошая книга об этом: 'iPhone App Developement - Создайте приложение за 5 дней с помощью SDK от ios 6 от Nick Kuh' и да, я думаю, что это генетическая теория создания класса для каждого контроллера вида, но иногда это зависит от того, что вы будете делать на нем. Проверьте книгу, которую я вам сказал. –

Смежные вопросы