如何在iphone的tableview中为单元格加载xib文件

时间:2011-07-11 09:14:08

标签: ios objective-c uitableview

我看到网上有很多关于这个问题的资源。我必须为我的单元格加载不同的XIB(UIViewContoller)文件。我设计了我的单元格,我希望在我的单元格中加载该设计。

我写了这段代码,但我得到了一个例外。

-[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'

这是我的加载nib文件的代码

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;

5 个答案:

答案 0 :(得分:14)

您应该在XIB文件中使用UITableViewCell而不是UIView

答案 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;
            }
        }

答案 2 :(得分:1)

虽然不是你问题的直接答案,但我建议你使用这个UITableViewCellFactory类,它非常方便:

http://blog.carbonfive.com/2009/07/16/loading-uitableviewcells-from-a-nib-file/

答案 3 :(得分: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];
    }
 }

答案 4 :(得分:0)

这就是我所做的。再一些技术很尴尬,我需要改进。

首先,我创建了一个UITableViewCell的新子类。问题是我没有选择“include”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是自我,而不是自我的子视图。但是hei ......不知道该怎么办。 ...

然后我为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;
    }
}

请注意,我将alloc与init分开。那有点尴尬。这就是为什么在我的 - (BGCRBusinessForDisplay2 *) initWithBiz: (Business *) biz中,如果之前已经初始化了一个单元格,我根本就不执行init的上半部分。我只是将Business *的值分配给BGCRBusinessForDisplay2中的各个插座。

我有人可以改善我的答案,欢迎他们。到目前为止它的作用。