Почему пользовательскому TableViewCell не нужен Владелец файла? - PullRequest
4 голосов
/ 05 октября 2011

Я пытался создать пользовательский UITableViewCell в Интерфейсном Разработчике и продолжал устанавливать владельца файла и пользовательский класс фактического UITableViewCell в мой новый пользовательский класс UITableViewCell. Я бы подключил IBOutlets от владельца файла и получал ошибки, когда дело доходило до:

 TVCell *cell = (TVCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {

    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"TVCell" owner:nil options:nil];

    for(id currentObject in topLevelObjects)
    {
        if([currentObject isKindOfClass:[TVCell class]])
        {
            cell = (TVCell *)currentObject;
            break;
        }
    }

Наконец я понял, что вы должны подключать IBOutlets из объекта UITableViewCell, а не владельца файла. Почему это?

Спасибо

Ответы [ 2 ]

6 голосов
/ 05 октября 2011

Владелец файла - это объект-заполнитель для объекта, который в конечном итоге загрузит NIB. Это способ для объектов за пределами NIB ссылаться на объекты внутри NIB. В вашем случае вы пытаетесь создать ячейку табличного представления из NIB, поэтому вам понадобится другой объект, чтобы стать владельцем. Ячейка табличного представления не может быть как снаружи, так и внутри NIB.

В этой строке вашего кода:

NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"TVCell" 
                                                         owner:nil
                                                       options:nil];

Вы можете указать объект для заполнителя Владелец файла в Интерфейсном Разработчике, к которому необходимо разрешить. Я предполагаю, что ваш код находится в классе, как «MyTableViewController». Если это так, вы можете передать 'self' для параметра владельца - [NSBundle loadNibNamed: owner:]. Если бы вы сделали это, у вас могли бы быть выходы в классе MyTableViewController, которые были бы полезны для загрузки этого NIB. В частности, вы можете использовать их, чтобы избежать цикла for, который у вас есть. Вы бы сделали это так:

  • Добавление выхода «loadedTableViewCell »в MyTableViewController
  • В кончике ячейки таблицы установите для владельца файла значение MyTableViewController.
  • Установите соединение для «loadedTableViewCell »от владельца файла к ячейке табличного представления.

Затем измените свой код, чтобы он был похож на это:

TVCell *cell = (TVCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    [[NSBundle mainBundle] loadNibNamed:@"TVCell" owner:self options:nil];
    cell = [self loadedTableViewCell];
    [self setLoadedTableViewCell:nil];
}
0 голосов
/ 05 октября 2011

Это потому, что вы вытаскиваете объекты из пера, а не используете весь перо, как если бы вы загружали контроллер. Это то, что делает for (id currentObject в topLevelObjects).

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