在单个tableview中显示与segmentedControl对应的TableView,而无需推送新视图

时间:2012-10-08 09:10:58

标签: iphone objective-c uitableview uisegmentedcontrol

我有一个tableViewController,我使用Interface Builder插入一个具有两个段的分段控制器。由于默认情况下,始终选择第一个分段,因此在显示与第一个分段对应的表视图时,我没有遇到任何问题。但是,当我单击第二个段时,我想显示另一个tableView。

这就是问题所在。 我在单击第二个段时调用newTableViewController类。因此,这种观点正在被推动。请建议我在单击段时在主tableView中使用这两个tableView的方法。

我使用了switch case来切换段。

以下是代码的相关部分: 此方法位于FirstTableViewController中,因为默认情况下会选择第一个段。

-(IBAction) segmentedControlChanged
{
     switch(segmentedControl.selectedSegmnentIndex)
     {
        case 0:
         //default first index selected. 
         [tableView setHidden:NO];
         break;
         case 1:
         NewViewController *controller=[[NewViewController alloc] initWithNibName:@"NewViewController" bundle:nil];
         self.navigationController pushViewController:controller animated:YES];
         [controller release];
         break;
         default:
         break;
     }
}

6 个答案:

答案 0 :(得分:2)

将以下代码放在案例1:

的第一行
if(self.tblView.isHidden==NO)
    self.tblView.hidden=YES;

就像,,,

case 1:
         if(self.tblView.isHidden==NO)
              self.tblView.hidden=YES;

         NewViewController *controller=[[NewViewController alloc] initWithNibName:@"NewViewController" bundle:nil];
         self.navigationController pushViewController:controller animated:YES];
         [controller release];
         break;

答案 1 :(得分:1)

您应该在同一个类中创建两个或更多UITableViews,或者更好地为单个UITableView创建不同的数组,然后使用条件将数组添加到同一个表中。我希望你明白我的观点。除非真的很重要,否则你不应该使用不同的类方法。

此外,这样可以省去从不同类别导入不同UITableViews的麻烦,从而减少内存管理。

答案 2 :(得分:1)

要在同一个类中添加两个tableview,您必须使用Tag for UITableView。根据选定的细分设置标记和上传数据。

我认为This 有同样的问题。

编辑。 有多种选择

  1. 如果表格结构/外观相同,您可以使用两个数组作为输入,并可以使用。
  2. 您可以使用两个不同的UITableView条件或使用Tag for Table View

答案 3 :(得分:1)

1.创建一个视图控制器说:MainViewController继承UIViewController(不是UITableViewController)。

2.在MainViewController中创建两个tableView,说mTableView1和mTableView2,并分别为tableview分配100和101分配标签。

3.创建一个变量,该变量将根据所选的段存储该值,如果选择了第一个段,则var = 100,等等。

4.在tableview数据源和委托方法中使用此var来找出选择的段,并显示相应的tableview。

如果您的tableview结构和功能相同,那么您甚至可以使用单个tableview并根据所选的段传递数据以在tableview中显示。

代码: 在viewDidLoad中添加以下代码:

m_TableView1 = [[UITableView alloc] initWithFrame:yourFrame];
m_TableView1.tag = 100;
    m_TableView1.dataSource = self;
    m_TableView1.delegate = self;
    [self.view addSubview: m_TableView1];
    [m_TableView1 release];



m_TableView2 = [[UITableView alloc] initWithFrame:yourFrame];
m_TableView2.tag = 101;
    m_TableView2.dataSource = self;
    m_TableView2.delegate = self;
    [self.view addSubview: m_TableView2];
    [m_TableView2 release];

然后在datasource和delegate方法中使用tag并提供如下适当的数据:

- (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];

            }
    if(tableView.tag == 100)
       cell.titleLabel.text = [NSString stringWithFormat:"First table, cell%d",indexPath.row];
   else
     cell.titleLabel.text = [NSString stringWithFormat:"Second table, cell%d",indexPath.row];

}

答案 4 :(得分:0)

改变这种方式:

1>默认情况下选择一个Tableview和Segmentation Control第一个段并选择First Table视图并将其userinteraction设置为false

2>当选择第二段时,隐藏第一个tableview并发回旧的tableview 并将第二个表视图放在前面并使其可见设置其userinteraction true

答案 5 :(得分:0)

-(IBAction) segmentedControlChanged
{
     switch(segmentedControl.selectedSegmnentIndex)
     {
        case 0:
         //default first index selected. 
         [tableView setHidden:NO];
      if([self.view viewWithTag:9999]){
      [[self.view viewWithTag:9999]removeFromSuperView]; //remove other table
     }
}
         break;
         case 1:
         NewViewController *controller=[[NewViewController alloc] initWithNibName:@"NewViewController" bundle:nil];
         [self.view addSubView:controller.view];
        [controller.view setTag:9999];
         break;
         default:
         break;
     }
}

    enter code here