【问题标题】:How do I maintain the UITableView selected row when returning from a UINavigationController child screen?从 UINavigationController 子屏幕返回时,如何维护 UITableView 选定的行?
【发布时间】:2011-07-22 19:42:02
【问题描述】:

我有一个客户的 UITableView,其中选择了一行/客户。然后,用户可以在 UINavigationController 堆栈上推送另一个视图以添加新客户。当我弹出子屏幕并返回 UITableView 之前选择的行不再被选中。

我可以在 viewDidAppear() 中重新选择该行,但它看起来很糟糕,因为您可以看到取消选择和选择。从子屏幕返回时,有没有办法保持选定的行?

【问题讨论】:

  • 选择,你的意思是突出显示吗?
  • 为了语义的利益,API 将 ChrisP 想要的状态称为“已选择”。视觉外观是一个亮点,但 Apple 将其称为一个选择。例如'setSelected:'、'didSelectRowAtIndexPath:'等等。

标签: iphone objective-c cocoa-touch uitableview


【解决方案1】:

我假设您使用的是表格视图控制器,否则无论如何编写此行为是您的责任。但是,在表格视图控制器中,这很容易。只需添加 viewDidLoad:

self.clearsSelectionOnViewWillAppear = NO;

这将使该行保持选中状态,除非您手动取消选择该行或用户选择表格上的另一行。

【讨论】:

    【解决方案2】:

    如果您在 viewWillAppear: 中选择它,它应该在用户没有看到的情况下被选中。这能解决你的问题吗?

    【讨论】:

    • 这就是我尝试过的,用户可以看到重新选择。我希望在已选择行的情况下显示视图,就像用户离开屏幕以向下钻取到子屏幕时一样。
    【解决方案3】:

    您需要致电:

    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    

    这可以在 UITableView 的 didSelectRowAtIndexPath 委托方法中找到。

    【讨论】:

    • 这如何帮助解决当用户从子视图返回到主视图时选择行的目标?这不会导致该行不被选中吗?
    【解决方案4】:

    默认情况下,当您返回该 VC 时,选定的行会被取消选择(带有动画)。
    因此,如果您推送 DetailViewController,则单元格将保持选中状态,直到您返回 RootViewController,然后自动取消选中。

    我以前也有这样的问题。确保始终调用超类的方法实现,例如 viewWillAppear、viewWillDisappear 等。
    另外,不要手动调用 deselectRowAtIndexPath:。

    【讨论】:

      【解决方案5】:

      这是可能的:

      仅在一次情况下:如果您在 TAbleView 中有静态内容,

      just reload the TableView in ViewDidLoad only, not in View will Appear.
      
      
      whereas make sure, you don't allow table to reload anywhere in same class in any method. Then you can achieve what you want.
      

      单元格因重新加载 TAbleView 而被取消选择。

      但是对于动态内容,需要使用委托方法:

      - (void)selectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition;
      

      在此您需要传递要显示的 indexPath,其滚动位置与 tableviewposition 相同。

      【讨论】:

        【解决方案6】:

        您不能一直选择 tableViewCell。一旦达到目的,它就会恢复正常。我认为您的意思是突出显示或似乎被选中,我正在基于此回答问题。

        获取在cellForRowAtIndexPath 处选择的行。当您弹出导航控制器并返回 tableView 时,转到 cellForRowAtIndexPath 并突出显示该单元格(您可以根据需要使用任何 UIColor)-没有特定的方法来突出显示内容-发挥您的想象力-默认突出显示样式为蓝色,文本为白色。

        这是怎么做到的?

        1. cellForRowAtIndexPath 中查找选定的行
        2. Store 位于外部变量 / 或 NSUserDefaults 中,您还可以使用 NSUserDefaults 在屏幕之间进行通信,以了解是否从该屏幕弹出项目。
        3. [tableView reloadData]viewWillAppear
        4. 检查 cellForRowAtIndexPath 中的 NSUserDefaults 值并使用 cell.backgroundColor 或其他内容修改该单元格。

        【讨论】:

        • 这是不正确的。查看我的答案,了解一种保持表格视图单元格突出显示的方法,并在页面转换中保持突出显示。
        【解决方案7】:

        如果没有一些代码,我只能给出一个建议:停止使用[tableView reloadData],使用[tableView beginUpdates][tableView endUpdates]– insertRowsAtIndexPaths:withRowAnimation:– reloadRowsAtIndexPaths:withRowAnimation:。事情应该会按预期进行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-12-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-10
          相关资源
          最近更新 更多