如何利用UITableViewController使用UISegmentedControl?

时间:2013-07-18 06:08:35

标签: ios objective-c uitableview uisegmentedcontrol

我有UITableViewController有5个不同的部分,&每个部分包含一个单独的单元格在第1部分中,我有UISegmentedControl提供了两个选项,默认情况下,第1段被选中,因此其余部分(其他4个)与第1段相对应。但是,我遇到的问题是:有能力切换到另一个UITableView,其他部分&当然,当UISegmentedControl

中选择了段2时,将对应于段2的单元格

我正在为这个项目使用故事板。

我知道如何实现这一目标的问题已被问过一千次了,如果我使用常规视图控制器,我知道如何做到这一点,我不熟悉使用UITableViewController这是真的让我很难过。

我尝试过的事情:

No.1:我尝试将UITableViewController全部删除,并替换为普通ViewController并将UITableView替换为主视图。问题在于我被xcode给出了错误,因为静态单元格需要UITableViewController才能工作,(不幸的是我正在使用静态单元格)。

No.2:我试图用UISegmentedControl中的条件隐藏单元格,只显示具有相应选择的相应单元格,但这不起作用,因为我是无法添加我的其他部分&顶部的单元格(正如我通常用常规UIViewController完成的那样。

这是我用来尝试方法#2的代码:

- (IBAction)segmentedControl:(id)sender {

    UISegmentedControl *segmentedControl = (UISegmentedControl *) sender;
    NSInteger selectedSegment = segmentedControl.selectedSegmentIndex;

    if (selectedSegment == 0)
    {
        upick= 0;
        self.lengthCell.hidden=NO;
        self.widthCell.hidden=NO;
        self.depthCell.hidden=NO;
        self.flowCell.hidden=YES;

    }
    else if (selectedSegment == 1)
    {
        upick =1;
        self.lengthCell.hidden=YES;
        self.widthCell.hidden=YES;
        self.depthCell.hidden=YES;
        self.flowCell.hidden=NO;
    }

}

No.3:网上无数个小时的研究,但似乎无法找到我想要的确切结果,大多数人都会用UIViewController来展示如何做到这一点对于这种特殊情况,步骤是不同的。

我真的很感激一些建议&从这里开始的整体方向因为我被困住了。多谢你们!

2 个答案:

答案 0 :(得分:3)

  1. 在表格视图控制器中提供所需的所有单元格。

  2. 在表格视图的数据源方法(即numberOfSectionsnumberOfRowsInSectioncellForRowAtIndexPath)中,您可以为这两种状态设置所有正确的数字和数据。

  3. 当分段控件发生变化时,您可以做两件事。要么你只是reloadData,就像之前建议的那样,但是你没有得到任何动画。或者您使用insertRowsAtIndexPaths:withRowAnimation:deleteRowsAtIndexPaths:withRowAnimation:来获得动画效果。

  4. E.g。显示案例1中的1-2节和案例2中的3-6节(第0节是顶部);每个部分有2行

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
       return _control.selectedSegmentIndex == 0 ? 3 : 4;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView 
          numberOfRowsInSection:(NSInteger)section {
       return section == 0 ? 1 : 2;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView 
          cellForRowAtIndexPath:(NSIndexPath *)indexPath   {
       // .. the usual boilerplate
       if (_control.selectedSegmentIndex == 0) { /* configure cell */ }
       else { /*do the same for the other case */ }
       return cell;
    }
    
    -(void)segmentedControlDidChange:(UISegmentedControl*)sender {
        NSIndexSet *indexes;
        [_tableView beginUpdates];
        if (sender.selectedSegmentIndex == 0) {
            indexes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1,4)];
            [_tableView deleteSections:indexes 
                      withRowAnimation: UITableViewRowAnimationFade];
            indexes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1,2)];
            [_tableView insertSections:indexes 
                      withRowAnimation: UITableViewRowAnimationFade];
           [_tableView reloadSections:indexes 
                      withRowAnimation: UITableViewRowAnimationNone];
        }
        else {
             // do the reverse
        }
        [_tableView endUpdates];
    }
    

答案 1 :(得分:0)

如果我是正确的,您需要使用UISegmentedControl在2个表视图之间切换。您可以使用UIViewController并向其添加2个UITableViews,并将UISegmentedControl保留在表视图之外。然后可以通过以下方法管理它:

- (IBAction)segmentedControl:(id)sender {

    UISegmentedControl *segmentedControl = (UISegmentedControl *) sender;
    NSInteger selectedSegment = segmentedControl.selectedSegmentIndex;

    if (selectedSegment == 0)
    {
    //show Table1 and hide Table2
    // Reload Table1

    }
    else if (selectedSegment == 1)
    {
    //show Table2 and hide Table1
    // Reload Table2
    }

}

希望这有帮助。