2015-05-02 2 views
1

У меня есть два пользовательских UITableViewCell's. Назовем их cellA и cellB. Они очень похожи. Оба имеют название, подзаголовок, и image вид расположен в том же месте. Тем не менее, cellB также имеет дополнительную отметку .Как я могу использовать два разных пользовательских UITableViewCell в UITableView?

Теперь каждая из этих пользовательских ячеек находится в своих собственных файлах nib.

1) Чтобы зарегистрировать их оба, сделаете ли вы следующий код или оба они будут помещены в один и тот же файл nib?

UINib *cellANib = [UINib nibWithNibName:@"CellACell" bundle:nil]; 
[self.tableView registerNib:cellANib forCellReuseIdentifier:@"ACell"]; 
UINib *cellBNib = [UINib nibWithNibName:@"CellBCell" bundle:nil]; 
[self.tableView registerNib:cellBNib forCellReuseIdentifier:@"BCell"]; 

2) В cellForRowAtIndexPath, я буду использовать либо Cella или CellB на основе данных. Должен ли я разблокировать весь метод с помощью одного огромного оператора if или как я могу позвонить cell.title.text =, не отбрасывая ячейку в выражении if. Как ...

if (data.type == DATA_TYPE_A) { 
    ((CellACell *)cell).title.text = data.title; 
} 
else { 
    ((CellBCell *)cell).title.text = data.title; 
} 

Как я могу избежать такого беспорядка? Могу ли я заставить обе ячейки расширять класс типа интерфейса или что-то в этом роде, поэтому мне не нужно бросать или разворачивать весь метод с помощью огромного оператора if?

EDIT:

Я думаю, что "сокрытие метки", которые не используются бы лучше. Как я могу их скрыть? Я упростил этот вопрос, но у меня есть 4 взгляда по горизонтали. [--- [1] - [2 ---- ----] - [3] - [4 ---- ----] ---]. У меня есть метки 1 и 3. 1 фиксируется на ведущем контроле. 3 фиксируется центр X на что-то еще на ячейке. Теперь для A-Data нужно использовать метки 1/2. B-Data необходимо использовать 1/2/3/4. Для данных A я хотел бы скрыть метки 3 и 4, а 2 - вправо, где 4 заканчивается. Как я могу добиться этого скрытия меток 3 и 4?

ответ

1

Вы можете, конечно, построить 2 разных интерфейса в 2 разных xib, но обе ячейки имеют одинаковый пользовательский класс. У вас будут все IBOutlets для всех элементов пользовательского интерфейса в обеих ячейках и просто подключите те, которые присутствуют в конкретном интерфейсе. В cellForRowAtIndexPath вам понадобится предложение if-else для деактивации соответствующей ячейки для определенных путей индекса, и только метка даты должна быть заполнена в if-else. Другие метки могут быть заполнены снаружи, так как обе ячейки будут иметь соответствующие выходы, и нет необходимости в литье. То, как вы делаете регистрацию xibs, отлично.

Другая возможность - просто иметь один xib со всеми ярлыками и скрыть тот, который вам не нужен, в строках, где у вас нет значения даты.

+0

Я добавил короткий EDIT к своему оригинальному сообщению. Не могли бы вы это проверить и объяснить, как я могу скрыть определенные ярлыки? –

+0

@chrisP, вы не можете сделать это (легко в любом случае), скрывая метки; скрытие не приводит к тому, что ограничения уходят. Я бы просто пошел с двумя разными версиями клеточного подхода. – rdelmar

0

Есть много ответов на ваши вопросы. Вы можете просто использовать CellA для всего и скрыть метку даты, где это необходимо. Вы можете сделать два метода: configureCellA(...) и configureCellB(...), которые вы можете вызвать в своих операторах cellForRowAtIndexPath(...) if; который сократит беспорядок этого конкретного метода. Вы можете настроить наследование так, чтобы они оба имели обычные метки и подкласс в качестве метки даты. У вас много вариантов.

EDIT: Для того, чтобы скрыть метки 3/4 и имеют этикетки 1/2 заполнить остальную часть пространства, вы можете установить label.hidden = true и сделать CGRect который является таким же, как этикетке вы прячетесь, за исключением того, установите width в 0. Предполагая, что вы используете автозапуск, метки будут расширяться.

+0

Я добавил короткий EDIT к своему оригинальному сообщению. Не могли бы вы это проверить и объяснить, как я могу скрыть определенные ярлыки? –

0

Для просто пряча дату вы можете сделать следующее Вы можете, есть класс от UITableViewCell, связанный с Cell в раскадровке, и все ваши IBoutlets в этом классе, унаследованном от UITableViewCell

внутри вас будут иметь функцию настроить данные и заполнит, чтобы ваш заголовок класса будет

// MySpecialTableCellClass.h 

@interface MySpecialTableCellClass : UITableViewCell 

-(void)setDataForCellWithTitle:(NSString *)title subTitle:(NSString *)subtitle image:(UIImage *)cellImage date:(NSDate *)cellDate; 

@end 

в исходном файле

@interface MySpecialTableCellClass() 

@property (nonatomic, weak) IBOutlet UITextField *title; 
@property (nonatomic, weak) IBOutlet UITextField *subTitle; 
@property (nonatomic, weak) IBOutlet UIImageView *imageDisplay; 
@property (nonatomic, weak) IBOutlet UITextField *date; 

@end 

@implementation MySpecialTableCellClass 

-(void)setDataForCellWithTitle:(NSString *)title subTitle:(NSString *)subtitle image:(UIImage *)cellImage date:(NSDate *)cellDate 
{ 
    [self.title setText:title]; 
    [self.subTitle setText:subtitle]; 
    self.imageDisplay.image = cellImage; 

    if(cellDate != nil) 
    { 
     NSString *dateString = [NSDateFormatter localizedStringFromDate:[NSDate date]            dateStyle:NSDateFormatterShortStyle              timeStyle:NSDateFormatterNoStyle]; 
     [self.date setText:dateString]; 
    } 
    else 
    { 
      //Hide it if the date was not found 
      self.date.hidden = YES; 
    } 


} 
@end 

и в вашей ячейке для функции Row

//Get the data from your element including image and date if needed 
MySpecialTableCellClass *cell = [tableView dequeueReusableCellWithIdentifier: @"CellIdentifier"]; 
[cell setDataForCellWithTitle:title subTitle:subtitle image:cellImage date:cellDate]; 
return cell; 
+0

Вы можете использовать эту же методологию, если хотите перейти на две разные ячейки, ваш родительский класс будет этим классом, а ваш унаследованный будет работать над функцией для данных с датой и без даты – Qazi

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