【问题标题】:UITableViewCells don't deselect when returning from a segue从 segue 返回时 UITableViewCells 不会取消选择
【发布时间】:2011-12-16 07:47:34
【问题描述】:

我有一个 UITableView,其中包含 Storyboard 中的单元格,以及将单元格连接到另一个视图的 segue。

当您选择一个单元格时,它会显示单元格选择动画(在我的情况下将单元格变为灰色)并将另一个视图推到屏幕上。但是当您返回 tableview 时,取消选择动画根本不显示(选择动画的反面)。由于我只是使用 segue,因此我希望默认情况下会处理此问题。

有没有办法强制它显示取消选择动画?

【问题讨论】:

标签: ios uitableview segue


【解决方案1】:

如果您的视图控制器是UITableViewController 的子类并且clearsSelectedOnViewWillAppear 设置为YES(这是默认值),这将自动处理。

在您的情况下,您可以使用与 UITableViewController 完全相同的方式来执行此操作。取消选中-viewWillAppear:中的选中行。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow];
    [self.tableView deselectRowAtIndexPath:selectedIndexPath animated:YES];
}

【讨论】:

  • 我的视图控制器是 UITableViewController 的子类。单元格在显示时被取消选择,它只是不显示动画 - 它从一开始就被取消选择。 (以防万一,我尝试了你的建议,但没有奏效。)
  • 刚刚在UINavigationController 中创建了一个带有UITableViewController 的示例项目,它会推送到另一个视图控制器。所有设置都使用带有 segues 的故事板并弹出视图控制器显示取消选择动画。也许原始视图控制器的视图正在被卸载,因此表的选择状态丢失了。这可能发生在高内存压力情况下。
  • 我的应用程序按照您的描述进行设置(但也带有选项卡),并且它使用核心数据。现在大部分请求只有两三条记录(用于测试),所以我认为这不会消耗内存资源。
  • 此代码是正确的,并且在接口构建器中直接存在选项(在选择UITableViewController时,不是TableView)“在外观上清除”。 span>
  • 无论是否选中该选项,我都会得到相同的行为。
【解决方案2】:

不确定是否使用 segue,但我经常想在视图控制器出现时刷新数据。但是,如果重新加载表,则会清除选择行。这是我用来维护选定行并在返回时显示取消选择动画的一些代码。这可能会对您有所帮助,因此我将在此处发布。

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    NSIndexPath *indexPath = [tableView indexPathForSelectedRow];
    [tableView reloadData];
    if(indexPath) {
        [tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
    }
}

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    NSIndexPath *indexPath = [tableView indexPathForSelectedRow];
    if(indexPath) {
        [tableView deselectRowAtIndexPath:indexPath animated:YES];  
    }
}

【讨论】:

  • 我确实重新加载了表格数据,但您的解决方案不起作用。 (我之前尝试过,但为了确保我再次尝试。)
  • 您是否在其他地方重新加载表格?还要确保在调用 viewWillAppear 之前没有删除选定的行。根据您的数据变化情况,重新选择同一行可能对您不起作用。
  • 我接受了这一点,尽管我从未解决过这个问题。我想我必须在某个地方重新加载。
【解决方案3】:

确保您正在调用 viewWill...viewDid... 方法的 super 实现

【讨论】:

  • 我在每个继承的方法中都这样做。
  • 你是如何回到你的 UITableViewController 的?当您在情节提要中使用push segue 时,您是否使用了默认的后退按钮?
  • 我是。我的 UITableViewController 在 UINavigationController 中,我使用导航控制器创建的后退按钮从详细视图返回到 tableview。 (并且 segue 是 push 类型)
  • 我的做法和你描述的一样,但从来没有遇到过这样的问题。不知道控制器的行为很难说,但我提出了一些想法。你确定它是你弹出的同一个视图控制器实例吗?您可以通过在 UITableViewController 的 viewDidAppear:viewDidDisappear: 上执行 NSLog(@"%@", self); 来测试它。
  • 是同一个控制器实例。
【解决方案4】:

对于 Swift 3

override func viewWillAppear(_ animated: Bool) {

    super.viewWillAppear(animated)
    if let path = tableView.indexPathForSelectedRow {

        tableView.deselectRow(at: path, animated: true)
    }
}

【讨论】:

    【解决方案5】:

    快速更新:-

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(true)
        if tableView.indexPathForSelectedRow != nil {
            let indexPath: NSIndexPath = tableView.indexPathForSelectedRow!
            tableView.deselectRowAtIndexPath(indexPath, animated: true)
        }
    }
    

    【讨论】:

      【解决方案6】:

      更好的 Swift 更新:

       override func viewWillAppear(animated: Bool) {
          super.viewWillAppear(animated)
      
          if let path = tableView.indexPathForSelectedRow {
      
              tableView.deselectRowAtIndexPath(path, animated: true)
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-21
        • 1970-01-01
        • 1970-01-01
        • 2020-08-31
        相关资源
        最近更新 更多