单个视图上的2个tableview

时间:2010-08-15 20:58:55

标签: objective-c ios cocoa-touch uitableview

我需要一个示例或解释如何填充同一视图上的2个表视图。我需要了解“cellForRowAtIndexPath”方法,有人可以给我一个关于代码应该如何的例子吗?

我的意思是如何识别哪个表视图?

由于

下面是我的cellForRowAtIndexPath方法:

 // Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

// Configure the cell...
// Set up the cell
MyAppAppDelegate *appDelegate = (MyAppAppDelegate *)[[UIApplication sharedApplication] delegate];
    if (tableView == radios_tv) { //radio_tv is an IBOutleet UITableView
        sqlClass *aRadio = (sqlClass *)[appDelegate.array_radios objectAtIndex:indexPath.row];
        [cell setText:aRadio.r_name];
        return cell;
    }
    if (tableView == presets_tv) { //preset_tv is an IBOutlet UITableView


    }

}

和嘿vikingsegundo,现在我需要删除我的TableViewController类上的一个单元格,我该怎么做?我解释一下,这是我的代码:

- (void)tableView:(UITableView *)tv commitEditingStyle:(UITableViewCellEditingStyle)editingStyle 
forRowAtIndexPath:(NSIndexPath *)indexPath {

    if(editingStyle == UITableViewCellEditingStyleDelete) {

        //Get the object to delete from the array.
        Coffee *coffeeObj = [appDelegate.coffeeArray objectAtIndex:indexPath.row];
        [appDelegate removeCoffee:coffeeObj];

        //Delete the object from the table.
        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }
}

由于我们使用不同的控制器,我们应该如何处理这条线?我应该把tableViewController而不是“self”吗?

//Delete the object from the table.
            [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

2 个答案:

答案 0 :(得分:9)

IMO最干净的解决方案是为每个tableview配备一个控制器。

radios_tv会将其称为自己的委托方法,而presets_tv会将其称为自己的方法。

修改

如果你为n tableview使用一个控制器,你将不得不在很多地方使用if-statemenst, 在

  • – numberOfSectionsInTableView:
  • – tableView:numberOfRowsInSection:
  • – tableView:titleForHeaderInSection:
  • ...

基本上在您需要实现的所有UITableViewDatasource-Protocol方法中。

因此,如果您需要更改某些内容,则必须在许多地方进行更改。

如果您为一个tableview使用一个控制器类,则根本不需要检查。

  1. 为每个tableview编写一个控制器类,使其符合UITableViewDatasource协议
    • 实施您需要的协议方法。至少
      • – numberOfSectionsInTableView:
      • – tableView:numberOfRowsInSection:
      • – tableView:cellForRowAtIndexPath:
  2. 为每个tableview调用-setDataSource:到右控制器类的对象
  3. 我认为,它显示在其中一个WWDC 2010 videos中。我不确定,但我想这是 Session 116 - 适用于iPhone OS的模型 - 视图 - 控制器

    修改

    我写了一个示例代码:http://github.com/vikingosegundo/my-programming-examples

答案 1 :(得分:0)

在一个视图控制器上,如果你必须使用两个表,那么你可以将IBOutlet设置为两个表或为它们分配不同的标记,这样当你使用下面的cellForRowAtIndexPath时,你可以在两个表中区分如下

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

    UITableViewCellStyle style =UITableViewCellStyleSubtitle;
    static NSString *MyIdentifier = @"MyIdentifier"; 
    DataListCell  *cell = (DataListCell*)[tableView dequeueReusableCellWithIdentifier:MyIdentifier]; 

    cell = [[DataListCell alloc]  initWithStyle:style reuseIdentifier:MyIdentifier];

    cell.selectionStyle=UITableViewCellSelectionStyleNone;



        if(tableView==tblLanguage)//tblLanguage IBOutlet for first table
        {  
            if ((selectedIndexPath != nil) && (selectedIndexPath.row == indexPath.row))
            {

                UIImageView *imgView=[[UIImageView alloc]initWithFrame:CGRectMake(320-30, 9, 22, 15)];
                imgView.image=[UIImage imageNamed:@"btn_Expand.png"];
                [cell addSubview:imgView];



                tblSongs.hidden=NO;
                tblSongs.frame=CGRectMake(0,42, 320, ([arrSongListForSpecificLanguage count]*40));
                [cell addSubview:tblSongs];
            }
            else 
            {
                UIImageView *imgView=[[UIImageView alloc]initWithFrame:CGRectMake(320-30, 9, 16, 22)];
                imgView.image=[UIImage imageNamed:@"btn_Collaps.png"];
                [cell addSubview:imgView];
            }


            cell.lblCustomerName.textColor=[UIColor blackColor];
            cell.lblCustomerName.font=[UIFont boldSystemFontOfSize:16];




            //set the first label which is always a NamesArray object
            [cell setcustomerName:[objAppDelegate.viewController.arrLanguage objectAtIndex:indexPath.row]];
        }
        else //for other table
        {
            ParseData *objParse;
            objParse=[arrSongListForSpecificLanguage objectAtIndex:indexPath.row];



            cell.lblCustomerName.textColor=[UIColor blackColor];
            cell.lblCustomerName.frame=CGRectMake(cell.lblCustomerName.frame.origin.x, cell.lblCustomerName.frame.origin.y, 310, cell.lblCustomerName.frame.size.height);


            //set the first label which is always a NamesArray object
            [cell setcustomerName:objParse.track];

        }
        return cell;    
    }


}

您也可以使用与if语句相同的标记,如下所示 if(tableView.tag == 1)// tblLanguage tag = 1

类似if语句用于其他代表&表的数据源方法