web-dev-qa-db-ja.com

カスタムUITableviewCellを適切に初期化する方法は?

次の2つの方法を使用して、カスタムセルを返します。

- (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;

}

ここでセルで使用する正しいinitメソッドは何ですか?セルが初期化されたときにいくつかのプロパティを変更できますか?

編集:init/awakeFromNibメソッドが呼び出されていなかったため、問題が見つかりました。エラーを追跡しましたが、UITableViewCellからカスタムクラスに「カスタムクラス」を変更していませんでした。 awakeFromNibおよびinitWithCoderが以下のように機能するようになりました。

29

DoneButtonCellのクラス内で変更を行うことができます。

- (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;
}
36
Mostafa Berg

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
    }
}
5
TALE

これは私がカスタムセルを初期化する方法です

- (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;

}

}
3
  1. UITableViewのdequeueReusableCellWithIdentifierメソッドを使用して、可能であれば最初にセルのデキューを試みます。
  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を持つnibからビューがロードされるときに呼び出される指定された初期化子です。

1
Ayan Sengupta