2014-09-03 101 views
0

我有類層次與loadNibNamed在基類覆蓋兒童實例

ParentCell extends UITableViewCell 
ChildCell extends ParentCell 

ParentCell具有單獨的XIB,在子小區i被創建並在ParentCell XIB添加只有一個按鈕到一個視圖。但我不能添加此按鈕的操作。因爲即使我爲ChildCell創建了一個實例,它也會返回ParentCell的實例

因爲我使用loadNibNamed來獲得帶有IBOutlet連接的XIB。 @在ChildCell類在ParentCell類

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     self = [[NSBundle mainBundle] loadNibNamed:@"ParentCell" owner:self options:nil] 
       [0]; 
    } 
    return self; 
} 

initWithStyle方法@ initWithStyle方法

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     self.button=[[UIButton alloc] init]; 
     [self.contentView addSubview:button]; 
    } 
    return self; 
} 

@ - 視圖 - 控制器

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
      static NSString *CellIdentifier = @"ChildCell "; 
      ChildCell *cell=[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
      if (cell == nil) 
      { 
       cell=[[ChildCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 

       NSLog(@"Cell : %@", cell); //this have instance of ParentCell instead of ChildCell 
      } 
} 

現在,通過這種方式

暫時解決@initWithStyle方法ParentCell類

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     NSBundle *mainBundle = [NSBundle mainBundle]; 
     NSArray *views = [mainBundle loadNibNamed:@"ParentCell" 
              owner:self 
              options:nil]; 
     //Here we are linking the view with appropriate IBOutlet by their tag 
     self.lblTitle=[views[0] viewWithTag:100]; 
     self.lblContent=[views[0] viewWithTag:200]; 
    } 
    return self; 
} 

@ initWithStyle方法ChildCell類

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     self.button=[[UIButton alloc] init]; 
     [self.contentView addSubview:button]; 
    } 
    return self; 
} 

但我不知道這是遵循正確的方法,或者我們有一些其他更好的方法,然後這個..

回答

1

你應該在你的UITableView類的viewDidLoad上使用registerNib:forCellReuseIdentifier:方法。

static NSString *parentCellIdentifier = @"parentCellIdentifier"; 
static NSString *childCellIdentifier = @"childCellIdentifier"; 

[self.tableView registerNib:[UINib nibWithNibName:@"ParentCell" bundle:nil] forCellReuseIdentifier:parentCellIdentifier]; 
[self.tableView registerNib:[UINib nibWithNibName:@"ChildCell" bundle:nil] forCellReuseIdentifier:childCellIdentifier]; 

(不要忘記設置相應的ReuseIdentifier在XIB文件)

這是最好的做法,你可以擺脫你的initWithStyle實現。