UITableView推送segue多次触发

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UITableView推送segue多次触发相关的知识,希望对你有一定的参考价值。

我在我的应用中遇到了一个奇怪的错误:

设置

一个简单的Master-Detail应用程序,iPhone风格(即没有拆分视图,没有弹出框,只有导航控制器,表视图控制器和视图控制器)。

错误

  1. 触摸表格视图的“背景”部分(我的屏幕截图中较暗的灰色部分),如章节页眉或页脚。
  2. 在将手指放在屏幕上的同时,多次触摸一个单元格。
  3. 释放所有手指。 “详细信息”视图将正常推送,但是当触摸后退按钮时,您会发现在步骤2中触摸单元格时,详细视图的堆叠次数。

您还可以在步骤2触摸多个单元格,其目标视图将按正确的顺序堆叠:)

重现它

我能够用一个干净的,新创建的应用程序,以及用于iPhone的Twitter应用程序的最后一个版本(通过用手指#1触摸“加载”标签并多次触摸推文)来重现该错误。

但是,我无法在“常规”选项卡(这是一个分组的表视图)下的“设置”应用中触发相同的行为。

该错误在ios 6.0和6.1上重现。我没有旧版本的设备进行测试。

在创建基于导航/表视图的应用程序时,这是一个众所周知的技巧吗?如果有,是否有解决方案来防止这种(奇怪的)行为?或者这是一个iOS错误(如果是这样,它是否已经从Apple知道)?

答案

您可以使用的可能的间隙措施是实施

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender

并使用布尔标志或其他东西来表明您当前正在尝试执行该segue。例如:

BOOL doingSegue = NO;

-(void) viewWillAppear
{

    doingSegue = NO;
}

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
{

    if ( [identifier isEqualToString:@"MySegueIdentifier"] )
    {
        if ( doingSegue )
        {
            return NO;
        }
        else
        {
            doingSegue = YES;
            return YES;
        }
    }
    return YES;
}

Swift版本

var doingSegue = false

override func viewWillAppear(_ animated: Bool) {
    doingSegue = false
}

override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
    if identifier == "MySegueIdentifier" {
        if doingSegue {
            return false
        }
        else {
            doingSegue = true
            return true
        }
    }
    return true
}
另一答案

这是由Apple在iOS 7中修复的。

对于操作系统的早期版本,Dan F's answer应该做到这一点。

以上是关于UITableView推送segue多次触发的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationController 不推送

在地图视图上长按触发推送 segue

ECSlidingViewController - 将 UITableView 和 segue 添加到另一个 ViewController

使用 unwind segues 通过 UITableViewcell 推送数据

UITableView显示和重新加载行为不同步

为啥 UITableViewRow 需要长按才能触发 segue?