Должен ли TableViewCell иметь свой собственный класс? - PullRequest
0 голосов
/ 24 сентября 2011

Я успешно использовал пользовательские UITableViewCells, используя отдельные классы, но я продолжаю думать, что есть более простой способ, поэтому я попробовал следующее.Таблица строится, но ячейки не заполнены (поэтому, вероятно, моя пользовательская ячейка отображается неправильно).Любые идеи приветствуются.

Мои файлы:

@interface RemediesPopUp : UIViewController <UITableViewDataSource, UITableViewDelegate>{

    UITableView *remediesDataTable;
    UITableViewCell *remediesTableCell;  // ** custom cell declared here **

    NSArray *remediesArray;

}

Элементы управления таблицей:

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

    static NSString *CellIdentifier = @"Cell";

    remediesTableCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (remediesTableCell == nil) {
        remediesTableCell = [[[UITableViewCell alloc] init] autorelease];
    }

    // Configure the cell.

    return remediesTableCell;

}

Я перетащил пользовательский объект ячейки в область файлов XIB (У меня есть вид и отдельная пользовательская ячейка отображается).Я подключил пользовательскую ячейку к диспетчеру файлов.Чтобы проверить, я вставил пару (статических) меток в пользовательскую ячейку, чтобы видеть, загружается ли она.

Страница и таблица загружаются просто отлично, но ячейки пустые (белые).

Есть идеи?

Ответы [ 2 ]

1 голос
/ 24 сентября 2011

Прежде всего, убедитесь, что ваша пользовательская ячейка является пользовательским подклассом (подкласс UITableViewCell) и имеет собственный файл пера (например, не интегрируйте его с вашим контроллером табличного представления).

В наконечнике выберите инспектора идентификации и убедитесь, что класс вашей ячейки равен CustomCell (или как вы его называли). Также убедитесь, что в инспекторе атрибутов вы установили для Identifier значение «CustomCellIdentifier» или аналогичное.

В вашем источнике данных табличного представления ваш tableView:cellForRowAtIndexPath метод должен содержать код, подобный следующему:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CustomCellIdentifier = @"CustomCellIdentifier";    // Same as you set in your nib

    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CustomCellIdentifier];
    if (cell == nil) {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];

        for (id oneCell in nib) {
            if ([oneObject isKindOfClass:[CustomCell class]]) {
                cell = (CustomCell *)oneCell;
            }
        }
    }

    // Customise the labels etc...

    return cell;
}

Это гарантирует, что ваша пользовательская ячейка загружается непосредственно из ее собственного пера, что позволяет вам визуально разметить любые виды или метки. Текст для этих меток может быть затем установлен после того, как соответствующая ячейка была снята с производства / создана.

В вашем коде ваша «обычная» ячейка - это просто UITableViewCell. Чтобы настроить ячейку с помощью конструктора интерфейса, вам нужно создать свой собственный подкласс этого.

EDIT

Для пользовательской ячейки, которая использует только перо (и , а не пользовательский подкласс), измените приведенный выше пример кода, чтобы привести ячейку к обычному UITableViewCell, то есть изменить CustomCell на UITableViewCell. В Интерфейсном Разработчике присвойте каждому из пользовательских представлений вашей ячейки (метки и т. Д.) Уникальный тег.

При этом код должен выглядеть примерно так:

#define MyLabelTag  10    // These should match the tags
#define MyViewTag   11    // assigned in Interface Builder.


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CustomCellIdentifier = @"CustomCellIdentifier";    // Same as you set in your nib

    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:CustomCellIdentifier];
    if (cell == nil) {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];

    for (id oneCell in nib) {
        if ([oneObject isKindOfClass:[UITableViewCell class]]) {
            cell = (UITableViewCell *)oneCell;
        }
    }
}

    // Get references to the views / labels from the tags.
    UILabel *myLabel = (UILabel *)[cell viewWithTag:MyLabelTag];
    UIView *myView = (UIView *)[cell viewWithTag:MyViewTag];

    // Customise the views / labels...
    // ...

    return cell;
}
0 голосов
/ 24 сентября 2011

Что я обычно делаю, это помещаю UIView внутри UITableViewCell, а затем помещаю все ваши метки и другие элементы пользовательского интерфейса в этот UIView. Если это не сработает, дайте мне знать. У меня может быть другое решение.

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