阻止UITableView接收两个触摸(嵌套的弹出动画可能导致导航栏损坏)

nbu*_*urk 13 uitableview ios

UITableView在我的应用程序中使用了一个,当点击时,它将用于UINavigationController将另一个视图控制器推送到导航控制器的视图控制器堆栈.

然而,当tableview上的一个单元格被双重绑定时,tableView:didSelectRowAtIndexPath:会被调用两次,导致导航控制器将两个新的viewcontroller推入堆栈并导致以下控制台输出:

nested pop animation can result in corrupted navigation bar
Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.
Run Code Online (Sandbox Code Playgroud)

这不是一个非常重要的问题,因为用户不太可能对表视图单元格进行双击,但是我想知道是否有一种优雅的解决方案可以防止这种误导?(可能检查导航控制器topViewController并随后决定是否pushViewController:应该实际执行推送方法?).

Pan*_*cho 12

只是设置userInteractionEnabledNO这样

在你的 viewWillAppear

-(void)viewWillAppear:(BOOL)animated
{

  // if you return from another viewController
  [tableView setUserinteractionEnabled:YES];

}

-(void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

  // do your logic here and at the end just set user interaction to NO
  [tableView setUserInteractionEnabled:NO];

}
Run Code Online (Sandbox Code Playgroud)

这将阻止所有用户与您的tableview进行交互.


l0g*_*g3r 9

这是一线解决方案

self.tableView.multipleTouchEnabled = NO;
Run Code Online (Sandbox Code Playgroud)


小智 7

我发现这里描述的问题的修复程序是将所有的didSelectRowAtIndexPath代码包装在以下检查中:

    if ([[self navigationController] topViewController] == self) {
        [your existing didSelectRowAtIndexPath code here]
    }
Run Code Online (Sandbox Code Playgroud)

这将检查是否已将另一个视图控制器推送到视图控制器堆栈的顶部(并且仍在等待由于某种原因实际出现在屏幕上).

我相信其他地方提到的multiTouchEnabled属性实际上是指多点触控功能,它允许iOS同时注册多个触摸事件(例如,同时使用两个手指在屏幕上进行双指缩放)而不是多个顺序触动.


Ant*_*hko 6

乔丹索伦森现代化迅速:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
{
    if self.navigationController?.topViewController == self
    {
        self.performSegueWithIdentifier("whatever", sender:self)
    }
    else{
        // uncomment to break in else case print("fasttaper's superfluous input was ignored")
    }
}
Run Code Online (Sandbox Code Playgroud)