UITableView и его ячейка в файле xib

короче говоря, я хочу создать XIB-файл, где он содержит:

  1. вид. С этой точки зрения, у него есть много вещей и tableView. (подключенный источник данных, делегировать владельцу файла). Это мнение основной вид XIB файлов.

  2. пользовательская ячейка, (используйте в качестве ячейки прототипа tableView, так как XIB не поддерживает прототип tableView).

как я могу достичь обоих из них? кроме того, я хочу то же самое относится и к UICollectionView.

Я создал оба из них, загрузите его в основной вид (основной вид находится в главной раскадровке). Но tableView не загружает пользовательскую ячейку, как ожидалось. Ячейка просто пуста, не похожа на то, что она спроектирована в наконечнике.

правка 1

вот как я регистрирую перо в основной вид в раскадровке:

- (UIView *)buildViewFromViewControllerClass:(Class)viewControllerClass
{
    id viewController = [[viewControllerClass alloc] initWithNibName:NSStringFromClass(viewControllerClass) bundle:nil];
    [viewController view].frame = self.containerView.bounds;

    [self addChildViewController:viewController];

    return [viewController view];
}

у меня много viewControllers, поэтому я понимаю, что это лучший способ добавить VC.

о наконечнике в описании выше, я просто использую регулярную инициализацию:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // init cell
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell"];
    if (!cell) {
        cell = [[PaymentCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CustomCell"];
    }

    return cell;
}

если в представлении был метод загрузки, я регистрирую перо в tableView, он будет сбой в [tableView dequeueResuableCell...]. Зарегистрированный код:

- (void)viewDidLoad
{
    [super viewDidLoad];

//    [self.tableView registerNib:[UINib nibWithNibName:self.nibName bundle:nil]
//                forCellReuseIdentifier:@"CustomCell"];
// I'm commenting it, because it caused crash.
}

текст сообщения:

*** прекращение приложения из-за непойманные исключение 'NSUnknownKeyException', reason:'[ setValue:forUndefinedKey:]: этот класс не является ключевым значением кодирования-совместимый для ключ TableView для.'

что я здесь сделал не так? Вот картина, как я разработал перо:

Model

как вы можете видеть, mainView владельца файла подключен к mainView, где он содержит tableView. CustomCell - это просто настраиваемая ячейка, определенная в том же файле (the .m-файл.)

1 ответов


вы должны зарегистрировать перо следующим образом.

[self.tableView registerNib:[UINib nibWithNibName:@"MyCell" bundle:nil] forCellReuseIdentifier:@"MyCell"]

Я обычно видел, что registerClass не загружает представление, а только класс. Не знаю почему.

еще один .xib должен содержать только один вид. Таким образом, вы должны сделать другой для UITableViewCell и UITableView. Причина этого очень проста. Каждый раз при загрузке xib создается все представление внутри xib. Вам не нужна новая таблица каждый раз, когда вы создаете ячейку. Правильно?

как для аварии вы столкнулись. Ошибка выглядит так, как будто есть проблема с выходом с именем tableView. Попробуйте удалить розетки и повторно инициализировать их

дополнения

на UICollectionView вы можете зарегистрировать класс, он загрузит ваше представление из xib.

 [self.collectinView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:cellIdentifier]

обновление

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