как использовать NS_ENUM - PullRequest
0 голосов
/ 13 июня 2019

Я хочу использовать NS_ENUM. Я написал следующий код в моем файле .m. Теперь, когда мой cellForRowAtIndexPath называется. Я получил индексный путь. Теперь в соответствии с этим индексным путем я хочу извлечь строку, связанную с ним. Например, для индекса пути 0 я хочу извлечь изображения.

typedef NS_ENUM(NSInteger, TABLE_SECTION_ITEMS)
{

    Images = 0,
    Videos = 1,
    Documents = 2,    
    Audios = 3

};

1 Ответ

0 голосов
/ 13 июня 2019

Что мы обычно делаем в этом случае, так это всегда оставляем последний элемент в enum как «count» или «last». В вашем случае, например:

typedef NS_ENUM(NSInteger, TABLE_SECTION_ITEMS)
{
    TABLE_SECTION_Images,
    TABLE_SECTION_Videos,
    TABLE_SECTION_Documents,
    TABLE_SECTION_Audios,

    TABLE_SECTION_Count
};

Мы не указываем значения, поскольку это может нарушить логику. Но вы можете изменить порядок элементов и отказаться от них, поставив элементы после «count».

Тогда его использование выглядит примерно так:

@interface ViewController()<UITableViewDelegate, UITableViewDataSource>

@end

@implementation ViewController

- (NSString *)tableSectionName:(TABLE_SECTION_ITEMS)item {
    switch (item) {
        case TABLE_SECTION_Images: return @"Images";
        case TABLE_SECTION_Videos: return @"Videos";
        case TABLE_SECTION_Documents: return @"Documents";
        case TABLE_SECTION_Audios: return @"Audios";
        case TABLE_SECTION_Count: return nil;
    }
}

- (NSInteger)tableView:(nonnull UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return TABLE_SECTION_Count;
}

- (nonnull UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
    cell.textLabel.text = [self tableSectionName:indexPath.row];
    return cell;
}

@end

Таким образом, число строк просто TABLE_SECTION_Count, и вы можете естественно конвертировать между NSInteger и вашим перечислением, как видно из [self tableSectionName:indexPath.row].

Естественно, сопоставление для строк по-прежнему необходимо выполнить, как в tableSectionName. Он не простаивает, но теперь более чем управляем;

Когда вы добавляете новое значение перечисления (скажем, TABLE_SECTION_Documents2), вы получите n ошибку в tableSectionName, что вам нужно добавить новый случай (или, скорее, ошибку, связанную с ним, которая говорит, что Control может достичь конца пустая функция). Поэтому, как разработчик, вы должны заполнить его так:

- (NSString *)tableSectionName:(TABLE_SECTION_ITEMS)item {
    switch (item) {
        case TABLE_SECTION_Images: return @"Images";
        case TABLE_SECTION_Videos: return @"Videos";
        case TABLE_SECTION_Documents: return @"Documents";
        case TABLE_SECTION_Documents2: return @"Documents";
        case TABLE_SECTION_Audios: return @"Audios";
        case TABLE_SECTION_Count: return nil;
    }
}

Еще один бонус в том, что мы можем иметь «Документы» дважды. И чтобы исключить элемент, все, что нам нужно сделать, это переместить перечисление после подсчета:

typedef NS_ENUM(NSInteger, TABLE_SECTION_ITEMS)
{
    TABLE_SECTION_Images,
    TABLE_SECTION_Videos,
    TABLE_SECTION_Documents2,
    TABLE_SECTION_Audios,

    TABLE_SECTION_Count, // Always keep last

    // Deprecated items
    TABLE_SECTION_Documents
};

Теперь старые «Документы» не будут перечислены в вашем табличном представлении без необходимости изменения какого-либо кода. Не идеально, но все же довольно аккуратно.

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