【问题标题】:How to utilize a UISegmentedControl With a UITableViewController?如何将 UISegmentedControl 与 UITableViewController 结合使用?
【发布时间】:2013-07-18 17:34:30
【问题描述】:

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

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

我知道如何实现这一点的问题已经被问了一千次,如果我使用常规视图控制器,我知道如何做到这一点,我是使用 UITableViewController 的新手,这真的很给力我很难过。

我尝试过的事情:

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

第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 和步骤来做到这一点在这种特殊情况下有所不同。

我非常感谢从这里获得的一些建议和总体方向,因为我被困住了。多谢你们!

【问题讨论】:

  • 为什么不只为每个案例设置自定义单元格,并在选择分段控件的每个部分时reloadData
  • 你是如何设置 UISegmentedControl 的?直接在故事板中还是以编程方式?

标签: ios objective-c uitableview uisegmentedcontrol


【解决方案1】:
  1. 在表格视图控制器中提供您需要的所有单元格。

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

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

例如显示案例 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];
}

【讨论】:

  • 我喜欢您的回答所带来的结果,您介意发布一些示例代码吗?抱歉,我有点困惑,因为我不太熟悉使用UITableView,谢谢! @Mundi
  • 在使用storyboards制作静态单元格时可以实现吗?@Mundi
  • 不确定。静态细胞是一种奇怪而受限制的野兽。如果你想做任何花哨的事情,它必须是动态的。 (根据定义,隐藏和显示是“动态的”。)
【解决方案2】:

如果我是正确的,您需要使用 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
    }

}

希望这会有所帮助。

【讨论】:

  • 问题在于,当我尝试将另一个UITableView 添加到我的TableViewController 时,它不会从TableViewController 中删除它,这与我使用普通ViewController 执行此操作不同,例如,所以在构建时我收到以下错误,因为添加了UITableViewIllegal Configuration: Static table views are only valid when embedded in UITableViewController instances@Nameet
  • 当然,这就是为什么使用 tableview 控制器可能不是一个好主意的原因之一
猜你喜欢
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
  • 1970-01-01
  • 2021-12-11
  • 2012-04-01
  • 2017-06-13
  • 2019-02-09
相关资源
最近更新 更多