2011-07-11 63 views
6

我看到網上有很多關於這個問題的資源。我必須爲我的單元格加載不同的XIB(UIViewContoller)文件。我設計了我的單元格,並且希望在單元格中加載該設計。如何在iphone中的tableview中加載單元格的xib文件

我寫了這段代碼,但我得到一個異常。

-[UIView setTableViewStyle:]: unrecognized selector sent to instance 0x6040de0 
2011-07-11 14:42:27.461 TableViewTest[2776:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIView setTableViewStyle:]: unrecognized selector sent to instance 0x6040de0' 

這裏是我的筆尖加載文件的代碼

static NSString *CellIdentifier = @"Cell"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    // Load the top-level objects from the custom cell XIB. 
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"loadXibfile" owner:self options:nil]; 
    // Grab a pointer to the first object (presumably the custom cell, as that's all the XIB should contain). 
    cell = [topLevelObjects objectAtIndex:0]; 
} 


return cell; 
+0

http://adeem.me/blog/2009/05/30/iphone-sdk-tutorial-part-6-creating-custom-uitableviewcell-using-interface-builder-uitableview/這是很好的教程對於這個問題。 –

回答

14

你應該在你的XIB文件中使用UITableViewCell,而不是UIView

+1

+1幫助了我。爲什麼這個人不接受正確的答案。 –

2

這裏是解決方案,這對我和家庭是對你有用或者其他一些可能。

cell = [[[YourCustomcell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"] autorelease]; 
     NSArray *toplavelobject=[[NSBundle mainBundle]loadNibNamed:@"YourCustomcell" owner:self options:nil]; 
     for(id c in toplavelobject) 
     { 
      if ([c isKindOfClass:[UITableViewCell class]]) 
      { 
       cell=(YourCustomcell *) c; 
       break; 
      } 
     } 
0

這就是我所做的。再一些技術是非常尷尬的,我需要改進。

首先我創建了一個新的UITableViewCell的子類。問題是我沒有選擇檢查「包含」xib。就好像xib只適用於UIViewcontroller。我想你可以使用XIB創建UIViewController的子類,然後創建UITableViewCell的另一個子類並將該模板移動到UIViewController的子類。

作品。

然後我把這些功能:

@implementation BGCRBusinessForDisplay2 

- (NSString *) reuseIdentifier { 
    return [[self class] reuseIdentifier]; 
}; 
+ (NSString *) reuseIdentifier { 
    return NSStringFromClass([self class]); 
}; 

初始化我做的:

- (BGCRBusinessForDisplay2 *) initWithBiz: (Business *) biz 
{ 
    if (self.biz == nil) //First time set up 
    { 
     self = [super init]; //If use dequeueReusableCellWithIdentifier then I shouldn't change the address self points to right 
     NSString * className = NSStringFromClass([self class]); 
     PO (className); 
     [[NSBundle mainBundle] loadNibNamed:className owner:self options:nil]; 
     [self addSubview:self.view]; //What is this for? self.view is of type BGCRBusinessForDisplay2. That view should be self, not one of it's subview Things don't work without it though 
    } 
    if (biz==nil) 
    { 
     return self; //Useful if we only want to know the height of the cell 
    } 

    self.biz = biz; 
    self.Title.text = biz.Title; //Let's set this one thing first 
    self.Address.text=biz.ShortenedAddress; 

[self addSubview:self.view];是一種尷尬。這是其他人說我應該做的,沒有它就無法工作。其實我想self.view是自我,而不是自我的子視圖。但是,嘿......不知道如何去做。 ...

然後我實現這個對的cellForRowAtIndexPath

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

    //[FetchClass singleton].FetchController 
    if([BGMDCRFetchClass singleton].FetchController.fetchedObjects.count!=0){ 

     BGCRBusinessForDisplay2 *cell = (BGCRBusinessForDisplay2*)[tableView dequeueReusableCellWithIdentifier:[BGCRBusinessForDisplay2 reuseIdentifier]]; 

     if (cell == nil) 
     { 
      cell =[BGCRBusinessForDisplay2 alloc]; 
     } 
     else{ 
      while (false); 
     } 

     Business * theBiz=[[BGMDCRFetchClass singleton].FetchController objectAtIndexPath:indexPath]; 
     cell = [cell initWithBiz:theBiz]; 

     return cell; 
     //return theBiz.CustomCell; 
    }else{ 
     UITableViewCell * tvc=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"tvc"]; 
     return tvc; 
    } 
} 

請注意,我由init分開頁頭。這有點尷尬。這就是爲什麼在我的 - (BGCRBusinessForDisplay2 *) initWithBiz: (Business *) biz之前如果一個單元已經被初始化了,我只是不做init的上半部分。我只是將Business *的值分配給BGCRBusinessForDisplay2中的各個出口。

我有人可以提高我的答案,他們是受歡迎的。到目前爲止它的工作。

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

    NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d",indexPath.row]; 
    LatestNewsCell *cell = (LatestNewsCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) { 

     cell = [[[NSBundle mainBundle] loadNibNamed:@"LatestNewsCell" owner:self options:nil] objectAtIndex:0]; 
    } 
} 
相關問題