2013-03-10 3 views
0

Я совершенно новый для разработки iOS, и я не мог найти решение здесь или Google, поэтому я прошу отчаяния.iphone development: table view возвращает пустой стол

У меня есть класс «ViewController», который является подклассом UIViewController. Здесь, у меня есть:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([self.bookTitle.text length] > 0) 
     self.entries = [self.bookLibrary searchForBook:self.bookTitle.text]; 

    if ([segue.identifier isEqualToString: @"BookList"]) { 
     TableViewController *controller = (TableViewController *)segue.destinationViewController; 
     controller.itemCounter = [self.entries count]; 
     controller.bookLibrary = [self.entries allValues]; 
    } 
} 

мнение об этом на раскадровке имеет подключение к таблице View Controller, что я перетащен на сетку. Я щелкнул «Контроллер табличного представления» внизу и установил свой пользовательский класс «TableViewController» в поле ввода пользовательского класса.

Теперь, исходя из того, что я понимаю, метод выше передает все данные должным образом в TableViewController.

Вот один из методов, которые я имею в TableViewController

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *simpleTableIdentifier = @"BookCell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 

    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier]; 
    } 

    Book* book = [self.bookLibrary objectAtIndex:indexPath.row]; 

    cell.textLabel.text = book.title; 
    NSLog(@"%@", book.title); 
    return cell; 

}

Запись NSLog печатает из всех названий книг на консоли, так что я точно знаю, что данные были прошло. Однако, когда я запускаю программу и нажимаю кнопку, чтобы вытащить Table View, это просто пустая таблица. Любые намеки? Я могу загрузить весь проект. Был в этом несколько часов и немного расстроен. Пожалуйста, помогите :(

EDIT: Ответ, предложенный мной, я рассматриваю состояние своих переменных данных в методах таблицы. Это говорит о том, что их состояние не так, как я думаю, и что я должен использовать NSLog для печати своих значений. Я сделал именно это, и я вижу все распечатанные значения. Я не понимаю, что они имеют infact, имеют значения, назначенные им. Проблема не в том, что данные отсутствуют.

+1

Обновлен ли столбец '- (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) 'функция. С количеством отображаемых ячеек. – Marryat

+0

Да, у меня есть. Я установил его для возврата 1. – user2154684

+0

Кроме того, это может быть только опечатка, но вы сказали, что у вас есть класс ViewController, который является подклассом UIViewController. Однако, если вы собираетесь назначить этот класс UITableViewController, который вы вытащили, то он должен быть подклассом UITableViewController для соответствия. Если это не так, ваш класс не будет правильно подключен к UITableView. –

ответ

0

Убедитесь, что вы либо с использованием подкласса UITableViewController в качестве вашего VC (если вы используете UIableViewController ui-объект из поддона), или что вы правильно подключаете свойства делегата UITableView и datasource к своему VC (если вы используете простой Объект и подкласс UIViewController).

(смотрите комментарии на вопрос).

Попробуйте это:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    NSLog(@"bookLibrary.count %d", bookLibrary.count); 
    return [bookLibrary count]; 
} 

Вы обнаружите, что вещи не то, что вы думаете, что они ... Добавить в реализации viewDidLoad и viewWillAppear вместе с этим, каждый со своим собственным «я здесь «инструкция NSLog» и проследите поток этого второго контроллера представления. Опять же, вы обнаружите, что у вас есть некоторые проблемы с секвенированием, когда поток работает не так, как вы могли бы предположить.


Добавлен комментарий:

В конечном счете, происхождение вашей проблемы эта строка в вашем «отправке» контроллер подготовит для метода SEGUE:

controller.bookLibrary = [self.entries allValues]; 

Что это делает? Это вызов allValues объекта Dictionary. Этот метод генерирует новый массив (!), Содержащий значения. Вы не храните этот новый объект Array в любом постоянном хранилище.Вы просто использовать его, чтобы установить:

controller.bookLibrary = ... 

Итак, сразу после этого выполняется оператор, у вас есть:

  • объект массива в методе prepareForSegue (где код выполняется), что у Вас есть только хранится в одной переменной/держателем, который:
  • слабым указатель на объект, что более чем в контроллере вида назначения (TableViewController)

Метод заканчивается.

Массив, возвращенный [... allValues], не находится ни на чем в контроллере представления источника, поэтому единственное, что удерживает его от сбора мусора, является указателем на него в контроллере представления назначения.

Но этот указатель является слабым Указатель. По определению, если это единственный указатель на объект, указатель будет установлен на nil, а объект, выделенный для сбора мусора. Пуф! Нет больше объекта массива, и вы останетесь с указателем нуля.

Как вы обнаружили, установка «приемник» на сильная позволяет удерживать объект Array, даже после выхода другого кода, и это единственный указатель на массив.

(И ваш код не вызывается дважды. Если вы внимательно посмотрите на регистрацию - или еще лучше установили точку останова внутри метода get-row-count таблицы, вы увидите, что это только вызов один раз. Более раннее ведение журнала «У меня есть 8 объектов» происходит в другом коде, а не в вашем TableViewController.)

+0

Прежде всего, спасибо за очень быстрый ответ! Во-вторых, я уже делаю. – user2154684

+0

Посмотрел на ваш проект, и у вас есть множество проблем. Поместите некоторые инструкции NSLog в свой метод таблицы, и вы увидите, что ваши данные, когда эти методы запущены, не то, что вы думаете, это ... Распечатайте состояние своих данных в каждой точке, где вы делаете предположения о какие данные "должны существовать в настоящее время в варах", и вы обнаружите, что stat - это не то, что вы думаете. :-) –

+0

Еще раз спасибо за ответ. Таким образом, проблема связана с данными, а не с тем, как файл TableViewController связан с объектом Table View на раскадровке? – user2154684