2012-06-14 3 views
3

У меня возникли проблемы с получением моего CustomTableViewCell, подкласса UITableViewCell, чтобы появиться в моем представлении таблицы.Загрузка подкласса UITableViewCell с использованием файла XIB

Я использую xib для представления этой ячейки, но я предполагаю, что код для делегата источника данных не изменяется. Я постарался установить идентичный идентификатор повторного использования внутри ячейки представления таблицы XIB.

Я изолировал проблему с тем, что метод DataSource, который возвращает ячейку таблицы, не работает правильно, вот это:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    DataObject *foo = [self.dataArray objectAtIndex:indexPath.row]; 

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

    [[cell overview] setText:foo.overview]; 
    [[cell price] setText:foo.price]; 
    NSLog(@"cell initialized, description text is %@",cell.overview.text); 

    return cell; 
} 

Не знаю, почему это не работает, но это последний журнал оператор всегда печатает (нуль) в конце, и да, я действительно подтвердил, что свойство overview объекта данных имеет в нем действительную строку. То же самое для price.

+1

http://stackoverflow.com/questions/4195726/how-to -create-custom-tableviewcell-from-xib Попробуйте здесь !!! Я думаю, что ваш ответ есть! – trumpetlicks

+0

Да, это работает, но я получил исключение, когда я попробовал этот метод в первые несколько раз, см. Мой комментарий к принятому ответу о том, как этого избежать. –

+0

hey @AndrewLauerBarinov, так что я в порядке с тем же вопросом, но вместо этого я использую раскадровки. Интересно, что вы прокомментировали принятый ответ, я, похоже, не понял, что «сообщения IBOutlet сделаны в заявлении владельца файла», которое вы сказали. Извините, что я новичок в ios, поэтому я все еще пытаюсь изучить материал, который мне нужно делать с точки зрения соединений и т. Д. Не могли бы вы объяснить немного дальше? Благодаря! Также опубликовано что-то здесь http://stackoverflow.com/questions/15175472/custom-uitableviewcell-will-not-display-label-texts – gdubs

ответ

1

В файле .h вы пишете его.

IBOulet CustomTableViewCell *tableCell; 

и подключиться к владельцу файла в файле .xib CustomTableViewCell.

Вы изменяете это в (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

if (cell == nil) 
{ 
    [[NSBundle mainBundle] loadNibNamed:@"CustomTableViewCell" owner:self options:nil]; 
    cell = tableCell; 
} 

Я думаю, что это будет полезно для вас.

+0

Одна вещь, которую я хотел бы добавить, это убедиться, что ваши соединения IBOutlet сделаны с представлением НЕ владельца файла (вы получаете исключение, связанное с ключевым значением, если вы это сделаете) –

+0

Также получая это, когда я помещаю свойство на свой viewcontroller.h ... Соединение «" не может иметь объект-прототип в качестве адресата. – gdubs

5

1) Сделайте свой собственный класс клеток отдельный

2) XIB: изменения файла Владелец класс NSObject

3) XIB: UITableViewCell перейти к MyTableViewCell

4) Если вы хотите добавить в кодовая таблица вид в

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

    static NSString *CellIdentifier = @"MyCell"; 

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

    if (cell == nil) { 

     NSArray *arrayCellXib = [[NSBundle mainBundle] loadNibNamed:@"MyTableViewCell" 
                   owner:self 
                  options:nil]; 
     if (indexPath.row == 0) { 
      // first table cell 
      cell = [arrayCellXib objectAtIndex:0]; // * 
      ...... 
     }else { 

      cell = [arrayCellXib objectAtIndex:1]; // * 
     } 
     ... 
     } 
    return cell; 

} 

объект с индексом 0,1 ... являются индекс, для которого заказ вы делаете MyTableViewCell в XIb, если вы хотите иметь больше ТНА n одна пользовательская ячейка. означает в классе MyTableViewCell u сделать неограниченную пользовательскую ячейку и использовать в соответствии с требованием.

Как правило, просто сделать одну пользовательскую ячейку в XIB и сделать именно это:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
    int thisRow = indexPath.row; 
    NSString *exampleText = [yourData objectAtIndex:thisRow]; 

    static NSString *CellID = @"cu5"; 

    FancyCell *cell = 
     (FancyCell *)[tableView dequeueReusableCellWithIdentifier:CellID]; 
    if (cell == nil) 
     { 
     NSArray *cellTeam = 
      [[NSBundle mainBundle] loadNibNamed:@"FancyCell" 
      owner:self options:nil]; 
     cell = [cellTeam objectAtIndex:0]; 
     } 

    [cell someFunction:exampleText]; 
    [cell.someLabel setText:exampleText]; 
    return cell; 
    } 

Надеясь может помочь u :)

+0

Это действительно полезный ответ, большое вам спасибо. Это точно, как это сделать с помощью CUSTOM XIB и CUSTOM CLASS. Если вы хотите «JUST» использовать пользовательский xib (нет необходимости в настраиваемом классе), используйте ответ Jamihash здесь: http://stackoverflow.com/questions/15378788/how-can-i-use-custom-uitableviewcell и-UITableView-в-же-XIb – Fattie

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