在UITableView中显示多个自定义单元格?

时间:2012-03-04 00:14:45

标签: objective-c uitableview custom-controls

我在SnowLeopard上使用Xcode 4.2,我的项目正在使用故事板。我正在尝试使用2种不同的自定义单元格类型UITableViewsessionCell来实现infoCell。我可以让两种类型出现在同一个列表中,但现在我有一个新问题?! sessionCell会显示一次,然后会显示infoCells的X号 - 正如我想的那样 - 除了infoCell始终覆盖第一个sessionCell

- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section
{
return [self.people count];
}

//inside cellForRowAtIndexPath
    if(indexPath.row == 0) {
cell = [tableView dequeueReusableCellWithIdentifier:@"sessionCell"];
} else {
cell = [tableView dequeueReusableCellWithIdentifier:@"infoCell"];
}
...
return cell;

我试图说return array count + 1,甚至硬编码return 7(这符合我的例子)但两者都不正确!

myObject *person = [self.people objectAtIndex:indexPath.row];

或者我的问题出在上面这行?我甚至试过indexPath.row+1 ...

非常感谢任何帮助!!

2 个答案:

答案 0 :(得分:3)

如果我理解你的问题,第一个infoCell(第二个UITableView行)应该显示第一个人对象的数据,对吗?

然后你似乎想要:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *sessionCellID = @"sessionID";
    static NSString *infoCellID = @"infoID";

    if( indexPath.row == 0 ) {
        SessionCellClass *cell = nil;
        cell = (SessionCellClass *)[tableView dequeueReusableCellWithIdentifier:sessionCellID];
        if( !cell ) {
            //  do something to create a new instance of cell
            //  either alloc/initWithStyle or load via UINib
        }
        //  populate the cell with session model
        return cell;
    }
    else {
        InfoCellClass *cell = nil;
        cell = (InfoCellClass *)[tableView dequeueReusableCellWithIdentifier:infoCellID];
        if( !cell ) {
            //  do something to create a new instance of info cell
            //  either alloc/initWithStyle or load via UINib
            // ...

            //  get the model object:
            myObject *person = [[self people] objectAtIndex:indexPath.row - 1];

            //  populate the cell with that model object
            //  ...
            return cell;
        }
    }

您需要为行计数返回[[self people] count] + 1

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [[self people] count] + 1;
}

使第n行显示第(n-1)个数据。

答案 1 :(得分:0)

如果你查看if else部分,它会显示第一行是“sessionCell”而所有其他行都是“infoCells”我认为你想做的是将第一行设为sessionCell,第二行设为infoCell以及所有其他行peopleCells

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.people count] + 2; // Added two for sessionCell & infoCell
}

//inside cellForRowAtIndexPath
if(indexPath.row == 0) {
    cell = [tableView dequeueReusableCellWithIdentifier:@"sessionCell"];
} else if (indexPath.row == 1 {
    cell = [tableView dequeueReusableCellWithIdentifier:@"infoCell"];
} else {
    cell = [tableView dequeueReusableCellWithIdentifier:@"personCell"];
    Person *person = [self.people objectAtIndex:index.path.row - 2];
}

...
return cell;

更好的是,我会尝试制作两个不同的销售部分,一个用于信息,一个用于人

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 2;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return section == 0 ? 2 : self.people.count
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell = nil;
    if (indexPath.section == 0) {
        if(indexPath.row == 0) {
            cell = [tableView dequeueReusableCellWithIdentifier:@"sessionCell"];
            // configure session cell
        } else if (indexPath.row == 1 {
            cell = [tableView dequeueReusableCellWithIdentifier:@"infoCell"];
            // configure info cell
        }
    } else {
         cell = [tableView dequeueReusableCellWithIdentifier:@"infoCell"];
         Person *person = [self.people objectAtIndexPath:indexPath.row];
         // configure person cell
    }

    return cell;
}