2014-01-26 2 views
2

У меня возникла проблема с управлением пользовательским интерфейсом моего приложения. Приложение использует UITableView с несколькими ячейками прототипов. Все работает хорошо, у меня, как:Как ЭФФЕКТИВНО реализовать несколько пользовательских UITableViewCells с ТАКЖЕ различного контента?

TypeACell.h + m files 
TypeBCell.h + m files 
TypeBCell.h + m files 
etc. 

Я создал прототип клетки в моем UITableView раскадровке, и имеют, как 6 из них, каждый из которых связан с определенным типом клеток.

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

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

TypeACell 
    row1 
    row2 
    rowCustomA1 
    rowCustomA2 
TypeBCell 
    row1 
    row2 
    rowCustomB1 
    rowCustomB2 
etc. 

Тогда в cellForRowAtIndexPath у меня есть что-то вроде этого:

if(array[i] == TypeA){ 
    TypeACell *cell = [tblView dequeueReusableCellWithIdentifier:typeAIdentifier]; 
    set row1,row2, rowCustomA1, rowCustomA2; 
    display TypeACell 
} 
else if(array[i] == TypeB){ 
    TypeBCell *cell = [tblView dequeueReusableCellWithIdentifier:typeBIdentifier]; 
    set row1,row2, rowCustomB1, rowCustomB2; 
    display TypeBCell 
} 

Дело в том, что использование такого рода реализации, Я должен изменить 12 мест, чтобы внести изменения, что является общим для всех ячеек. Я ищу способ изменить свою реализацию. Мне было интересно, существует ли какой-то конкретный метод Objective-C, который поможет мне справиться с этой глупостью. Не могли бы вы предоставить мне свой опыт и советы?

Редактировать: Добавлена ​​инициализация ячейки для каждого «если». Прямо сейчас, это только проблема, которую я не могу решить в реализации на основе наследования.

+0

не специфичны для ObjC, но по-прежнему важно, чтобы понять: http://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming) – Krumelur

+0

Почему вы итерацию над массивом ? '-tableView: cellForRowAtIndexPath:' сообщает вам, какой элемент вам нужен. –

+0

Да, ты совершенно прав, это была просто ошибка в псевдокоде. Мысль cellForRowAtIndexPath, и вместо этого написал «для». Однако вопрос об использовании разных идентификаторов остается. – Michael

ответ

1

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

@interface CommonCell : UITableViewCell 
    ... // Common properties 
@end 
@interface TypeACell : CommonCell 
    ... // Properties specific to A 
@end 
@interface TypeBCell : CommonCell 
    ... // Properties specific to B 
@end 
@interface TypeCCell : CommonCell 
    ... // Properties specific to C 
@end 

Теперь ваш цикл может следует изменить следующим образом:

for(iteration over array){ 
    CommonCell *cell = ... 
    ... // set common elements 
    set row1, row2 
    if(array[i] == TypeA){ 
     set rowCustomA1, rowCustomA2; 
    } 
    else if(array[i] == TypeB){ 
     set rowCustomB1, rowCustomB2; 
    } 
    ... 
    display cell 
} 
+0

Я думал об использовании наследования, однако я не знаю, как обращаться с разными идентификаторами ячеек. В настоящее время каждый «if» содержит другое объявление ячейки i.e: if (typeA) {cell = [self.tableView dequeueReusableCellWithIdentifier: ktypeACell]; } – Michael

+0

Получил это решение, я добавил, если (..) elseif (..), чтобы определить, какой идентификатор использовать, и THEN создал CommonCell с правильным идентификатором. Позже в моем случае я использовал [[(TypeACell *) cell rowCustomA1] setText: @ "text"] для работы с необходимыми свойствами. Спасибо, подумал, что в iOS есть какая-то специальная конструкция, но хорошее старое наследование, сделал трюк :) – Michael

+0

@Michael. Вы могли бы избежать цепочки 'if'-' then'-'else' с помощью '[[NSClassFromString (@ NameofClass ") alloc] init];' – dasblinkenlight

1

Я не понимаю, почему вам нужно более одного подкласса UITableViewCell.

  1. Сделать свойства в ячейке максимально возможными: (row1, row2, row3, row4).
  2. Иметь разные взгляды на каждую ячейку только в прототипах.
  3. Вам нужно всего лишь различать различные типы в вашем массиве -tableView:cellForRowAtIndexPath:.

Пример:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    int cellType = array[indexPath.row]; 
    NSString *cellID = cellType == TypeA ? typeAIdentifier : typeBIdentifier; 
    MyCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID]; 

    cell.row1 = … 
    cell.row2 = … 
    cell.row3 = cellType == TypeA ? … : …; 
    cell.row4 = cellType == TypeA ? … : …; 

    return cell; 
} 
+0

Отличный ответ, это действительно отличный способ переделать реализацию моих ячеек. Вы заставили меня задаться вопросом, какой ответ (ваш или @dasblinkenlight) должен быть проверен как «правильный», поскольку оба они. – Michael

Смежные вопросы