Intereting Posts
Управление музыкальными плеерами iPod (например, Spotify) из приложения iOS Как получить доступ к файлу в частной / var-папке? UISearchBar не отображает панель видимости при настройке в раскадровке IOS Weird ошибка компилятора: «ожидается»] раньше; использование set-ter для константы NSString в singleton Как синхронизировать данные приложения и основные данные на устройствах iOS? Пользовательский editButtonItem – какой селектор используется для состояния Done Проверьте, содержит ли String строку String из массива Где хранить локальные переменные? NSKeyedArchiver или NSUserDefaults? Xcode изменяет размеры различных элементов в раскадровке после каждого фиксации UITextField очищается при прокрутке в UITableView – пользовательская ячейка iOS SKMaps не загружает аннотации (Xcode 6, Objective C) iPhone: возобновление фоновой музыки от сторонних приложений, таких как Spotify / Pandora? Как получить сокращенную версию административной области CLPlacemark интересно узнать, как знакомиться с символом в Time Profiler of Instruments с единственным адресом, отображаемым в Xcode iOS Обработка UIBarButtonItem способом размотки Segue

Подклассификация UITableViewCell (и, возможно, использование id)

Я пытаюсь найти способ не дублировать код, когда я настраиваю пользовательские ячейки в своем представлении таблицы. В настоящее время у меня есть класс BaseCell, подклассифицированный из UITableViewController, а затем два подкласса BaseCell: CellTypeOne и CellTypeTwo. Это тот тип настройки, который я использую на данный момент:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *type = [self.rowTypes objectAtIndex:indexPath.row]; if ([type isEqualToString:@"Type 1"]) { CellTypeOne *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell 1"]; cell.picture.image = // An image cell.caption.text = // A caption cell.author.text = // An author return cell; } else if {[type isEqualToString:@"Type 2"]) { CellTypeTwo *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell 2"]; cell.picture.image = // An image cell.caption.text = // A caption cell.number.text = // A number return cell; } } 

Поскольку некоторые из заданных свойств одинаковы для любого типа ячеек, мне интересно, есть ли способ сделать что-то вроде этого:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *type = [self.rowTypes objectAtIndex:indexPath.row]; id cell; if ([type isEqualToString:@"Type 1"]) { cell = [tableView dequeueReusableCellWithIdentifier:@"Cell 1"]; // Cast cell to (CellTypeOne *)? cell.author.text = // An author } else if {[type isEqualToString:@"Type 2"]) { CellTypeTwo *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell 2"]; // Cast cell to (CellTypeTwo *)? cell.number.text = // A number } cell.picture.image = // An image cell.caption.text = // A caption return cell; } 

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

 [(BaseCell *)cell picture].image = // An image 

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

Вы можете сделать переменную cell типа BaseCell* чтобы избежать приведения вне if:

 BaseCell *cell; if ([type isEqualToString:@"Type 1"]) { cell = [tableView dequeueReusableCellWithIdentifier:@"Cell 1"]; [[cell author] setText:/*an author*/]; } else if {[type isEqualToString:@"Type 2"]) { cell = [tableView dequeueReusableCellWithIdentifier:@"Cell 2"]; [[cell number] setText: /* a number */]; } cell.picture.image = // An image cell.caption.text = // A caption 

Кроме того, вы можете сохранить тип id и использовать синтаксис вызова метода вместо синтаксиса member (dot) за пределами ifs:

 id cell; // ... the code from your post [[cell picture] setImage: /* an image */]; [[cell caption] setText: /* a caption */]; 

Наконец, вы можете вообще избегать прикладов и квадратных скобок, объявив дополнительные переменные внутри вашего ifs:

 BaseCell *cell; if ([type isEqualToString:@"Type 1"]) { CallTypeOne *cellOne = [tableView dequeueReusableCellWithIdentifier:@"Cell 1"]; cellOne.author.text = // An author cell = cellOne; } else if {[type isEqualToString:@"Type 2"]) { CellTypeTwo *cellTwo = [tableView dequeueReusableCellWithIdentifier:@"Cell 2"]; cellTwo.number.text = // A number cell = cellTwo; }