Почему этот код TableView работает? - PullRequest
1 голос
/ 03 мая 2010

Я сделал опечатку при создании UITableViewCell с этим кодом:

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

    if (cell == nil) {
        NSLog(@"Creating cell");
        cell = [[[UITableViewCell alloc] 
            initWithStyle:UITableViewStylePlain
            reuseIdentifier:CellIdentifier] autorelease];
    }
    cell.textLabel.text = @"Hello";
    return cell;
}

В опечатке используется UITableViewStylePlain вместо UITableViewCellStyleDefault. Код работал нормально, создавая новые ячейки. Почему?

Ответы [ 3 ]

10 голосов
/ 03 мая 2010

Так определяются эти переменные.

typedef enum {
   UITableViewCellStyleDefault,
   UITableViewCellStyleValue1,
   UITableViewCellStyleValue2,
   UITableViewCellStyleSubtitle
} UITableViewCellStyle;

typedef enum {
   UITableViewStylePlain,
   UITableViewStyleGrouped
} UITableViewStyle;

И UITableViewCellStyleDefault, и UITableViewStylePlain имеют значение 0, поэтому они взаимозаменяемы

3 голосов
/ 03 мая 2010

Потому что UITableViewStylePlain объявлен как:

typedef enum {
    UITableViewStylePlain, 
    UITableViewStyleGrouped
} UITableViewStyle;

А UITableViewCellStyleDefault объявляется как:

typedef enum {
    UITableViewCellStyleDefault,
    UITableViewCellStyleValue1,
    UITableViewCellStyleValue2,
    UITableViewCellStyleSubtitle
} UITableViewCellStyle; 

В обоих случаях значение, о котором вы говорите, является первым в enum, что означает, что они оба скомпилируются в 0. Следовательно, они являются «взаимозаменяемыми» (хотя вы определенно не должны полагаться на это поведение в рабочем коде).

1 голос
/ 03 мая 2010

И UITableViewStylePlain, и UITableViewCellStyleDefault являются константами с целочисленным значением. Когда вы используете один из них, вы фактически не передаете константу методу, а получаете значение константы.

Как описано в других ответах, обе константы имеют одно и то же целочисленное значение, поэтому initWithStyle:reuseIdentifier получит идентификатор стиля, с которым он может работать, и даже не заметит, что вы указали константу, которая не имеет ничего для делать с этим методом.

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