2013-12-22 3 views
27

Я использую следующие 2 способа вернуть пользовательскую ячейку:Как правильно запустить пользовательский UITableviewCell?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    NSString *key = [self keyForIndexPath:indexPath]; 
    UITableViewCell *cell; 

    if ([key isEqualToString:DoneButtonCellKey]) { 
     cell = [self [self doneButtonCellForIndexPath:indexPath]; 
     return cell; 
    } else { 
     //code to return default cell... 
    } 
} 

Тогда:

- (DoneButtonCell *)doneButtonCellForIndexPath: (NSIndexPath *)indexPath { 

    DoneButtonCell *cell = [self.tableView dequeueReusableCellWithIdentifier:DoneButtonCellIdentifier forIndexPath:indexPath]; 
    return cell; 

} 

Что такое правильный метод инициализации для использования с ячейкой здесь, так что я могу изменить некоторые свойства ячейка, когда она инициализируется?

EDIT: Я нашел проблему, поскольку методы init/awakeFromNib не вызывались для меня. Я обнаружил ошибку, и я не изменил «Пользовательский класс» из UITableViewCell в свой собственный класс. Теперь awakeFromNib И initWithCoder работают, как описано ниже.

+0

ячейки уже init'd внутри '' dequeueReusablCellWithIdentiier: метод, вы можете изменить все эти параметры, прежде чем вернуть его! , какие параметры вы хотите настроить? –

+0

Я надеялся, что я могу настроить несколько вещей, включая текст label.numberOfLines или backgroundColor и т. Д. Но это все, что я не хочу делать каждый раз, когда создаю ячейку. –

+0

Я вас понимаю, тогда вы должны сделать это в классе DoneButtonCell, в методе awakeFromNib, я отправлю ответ, чтобы показать вам, как –

ответ

31

Вы можете сделать изменения внутри класса DoneButtonCell «s, либо в

- (void)awakeFromNib 
{ 
.. essential to call super .. 
super.awakeFromNib() 
//Changes done directly here, we have an object 
} 

Или initWithCoder: метод:

-(id)initWithCoder:(NSCoder*)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 

    if(self) 
    { 
    //Changes here after init'ing self 
    } 

    return self; 
} 
+4

Ни один из них не вызван в моем случае –

+0

Я нашел проблему, с которой я столкнулся, и добавил ее к моему вопросу выше. Это было именно то, что я искал благодаря! –

+0

Извините, только что просмотрел вашу проблему, я бы сказал вам сначала проверить свой класс :) Рад, что это сработало для вас, счастливый взлом! –

3

Это, как я инициализацией пользовательских клетки

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *simpleTableIdentifier = @"FileTableViewCell"; 

    FileTableViewCell *cell = (FileTableViewCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 
    if (cell == nil) 
    { 
     NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"FileTableViewCell" owner:self options:nil]; 
     cell = [nib objectAtIndex:0]; 
    } 

    // Configure the cell here... 
     // Configure the cell. 
FileRepresentation* fileRepresentation = _fileList[indexPath.row]; 
cell.textLabel.text = [self userFilename:[fileRepresentation.fileName stringByDeletingPathExtension]]; 

cell.detailTextLabel.text = [fileRepresentation modifiedDate]; 


cell.accessoryView=nil; 
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
[cell.progressIndicator setHidden:YES]; 

cell.imageView.image = [UIImage imageNamed:_fileImageName]; 

// Disable any user interaction while processing a request 
if (_fileIsOpen || _creatingDocument || _deletingDocument) { 

    cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    cell.textLabel.textColor = [UIColor grayColor]; 

} else { 

    cell.textLabel.textColor = [UIColor blackColor]; 
    cell.selectionStyle = UITableViewCellSelectionStyleDefault; 

} 

} 
+0

, тогда программная настройка может произойти в - (void) awakeFromNib? –

+1

Я думал, что с iOS 7+ вам больше не нужно делать, если (cell == nil) больше .. –

+0

Итак, метод dequeReusableCell теперь возвращает ячейку, если она не создана –

1
  1. Первая попытка из очереди клетки, если это возможно, используя dequeueReusableCellWithIdentifier метод UITableView.
  2. Если ячейка недоступна (nil), используйте [[NSBundle mainBundle] loadNibNamed:@"<#your custom cell nib name#>" owner:nil options:nil][0] для ее инициализации.
  3. В файле .m вашей пользовательской ячейки, реализовать initWithCoder: инициализатор кода пользовательской инициализации:

- (id)initWithCoder:(NSCoder *)aDecoder { 
    self = [super initWithCoder:aDecoder]; 
    //your custom initialization code 
    return self; 
} 

Это назначенный инициализатор, который вызывается, когда любой вид загружается из кончика пера с loadNibNamed, как пользовательская ячейка таблицы.

+1

Ячейка не должна быть nil. Если это так, используйте 'tableView.registerNib (<# nib: UINib #>, forCellReuseIdentifier: <#String#>)' Вы не должны вручную создавать экземпляр нити в 'cellForRowAtIndex' ... –

+0

@JohnGibb да, я согласен с вами, t нужно беспокоиться о получении значения «nil» во время dequeueing, если он уже зарегистрировал nib/class для ячейки. Тем не менее, я действительно не понял, как вручную создавать экземпляр наконечника может быть вредным. Не могли бы вы объяснить? –

+0

Он не будет повторно использован так, не так ли? Почему НЕ использовать 'registerNib' вместо этого? –

5

Если вы используете Swift, помните простой способ убедитесь, что представление инициализировано, когда оно создано, - это использовать метод didSet. Например, чтобы сделать UIImageView в круглую форму, которую вы могли бы добавить такой код:

@IBOutlet weak var profileImageView: UIImageView! { 
    didSet { 
     // Make the profile icon circle. 
     profileImageView.layer.cornerRadius = self.profileImageView.frame.size.width/2 
     profileImageView.clipsToBounds = true 
    } 
} 
+0

славный, что, если профильImageView находится в UITableViewCell, и когда ячейка появится на экране после выхода на экран, она будет вызвана снова? –

+0

№. Ячейка создается один раз, а затем повторно используется в нескольких местах. Ознакомьтесь с методом подготовки к повторному использованию, если вам нужно сбросить что-то каждый раз, когда используется ячейка. – TALE

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