Загрузка подкласса UITableViewCell с использованием файла XIB

У меня проблемы с получениемCustomTableViewCellподклассUITableViewCell появляться в моем представлении таблицы.

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

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

- (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.

 Andrew Lauer Barinov05 мар. 2013 г., 02:18
Когда вы создаете соединения в IB, вы обычно делаете это в «Владельце файла» (который обычно является UIViewController или подклассом), в этом случае вы хотите установить соединение с представлением, которое можно найти внутри поля, помеченного контроллером представления. сцена (по состоянию на xcode 4.6)
 gdubs04 мар. 2013 г., 06:23
Привет @AndrewLauerBarinov, так что я в той же проблеме, но вместо этого я использую раскадровки. Мне было интересно узнать о вашем комментарии к принятому ответу. Похоже, я не понял, что "IBOutlet установил соединение с мнением, а НЕ с владельцем файла". заявление вы сказали. Извините, я немного знаком с ios, поэтому я все еще пытаюсь изучить то, что мне нужно сделать с точки зрения связей и прочего. Можете ли вы объяснить немного дальше? Спасибо! Также размещено что-то здесьstackoverflow.com/questions/15175472/…
 Andrew Lauer Barinov14 июн. 2012 г., 21:13
Да, это работает, но я получил исключение, когда попробовал этот метод несколько раз, см. Мой комментарий к принятому ответу, чтобы узнать, как этого избежать.
 trumpetlicks14 июн. 2012 г., 03:36
stackoverflow.com/questions/4195726/…  Попробуй здесь !!! Я думаю, что ваш ответ там!

Ответы на вопрос(2)

Решение Вопроса

В .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;
 }

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

 04 мар. 2013 г., 06:32
Также получаю это всякий раз, когда я помещаю свойство в свой viewcontroller.h ... Connection & quot; & quot; не может иметь объект-прототип в качестве пункта назначения.
 Andrew Lauer Barinov14 июн. 2012 г., 21:12
Одна вещь, которую я хотел бы добавить, - убедиться, что ваши соединения IBOutlet установлены с представлением, а не с владельцем файла (вы получите исключение, связанное со значением ключа, если вы это сделаете)

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, если вы хотите иметь более одной пользовательской ячейки. означает, что в классе MyTableViewCell вы можете создать неограниченную пользовательскую ячейку и использовать ее в соответствии с требованиями.

Как правило, просто сделайте одну пользовательскую ячейку в 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;
    }

Надеюсь может помочь тебе :)

 05 нояб. 2013 г., 18:19
Это действительно полезный ответ, большое спасибо. Это именно то, как это сделать с CUSTOM XIB и CUSTOM CLASS. Если вы хотите "просто" используйте пользовательский xib (не нужен пользовательский класс), используйте ответ Jamihash здесь:stackoverflow.com/questions/15378788/…

Ваш ответ на вопрос