【问题标题】:UITableView push segue triggered multiple timesUITableView push segue 触发多次
【发布时间】:2013-02-22 20:58:29
【问题描述】:

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

设置

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

错误

  1. 触摸表格视图的“背景”部分(我的屏幕截图中的深灰色部分),例如部分页眉或页脚。
  2. 在将手指放在屏幕上的同时,多次触摸一个单元格。
  3. 松开所有手指。 “detail”视图会正常推送,但是当点击返回按钮时,你会发现detail view被堆叠的次数与你在第2步中点击单元格的次数一样多。

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

复制它

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

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

该错误已在 iOS 6.0 和 6.1 上重现。我没有要测试的旧版本设备。

问题

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

【问题讨论】:

  • 我无法在我的应用程序中重现此错误 - 一旦选择了一个单元格,就会推送一个 segue :我不能像你一样选择多个单元格 - 所以它可能与特定方式有关您的应用程序(或其他)处理 segue 推送。一个问题:为什么你的故事板上在你的桌子和下面的 viewController 之间有 3 个 segue?一个就够了
  • 这只是为了允许在多个单元格上测试 segue。表格视图包含静态单元格,我为每个单元格创建了一个 segue。然而,我的“真实”应用程序使用动态单元格,只有一个 segue(使用 ctrl+drag 创建到下一个控制器,非常经典)。我刚刚添加了我只在 iOS 6.x 上测试过的问题。您在测试早期版本吗?
  • 即使将此segue设置为“自定义”并以编程方式执行操作时,您也会遇到此错误:从您的表委托didSelectCellAtIndexPath:调用performSegueWithIdentifier?这是我处理它的方式,我无法选择多个单元格(iOS 6)
  • 我能够重现这个错误
  • @Vinzzz 是的,我刚刚也用这个设置重现了这个错误。 (控制器之间的自定义 segue 并从 didSelectCellAtIndexPath: 调用 performSegueWithIdentifier:)。

标签: ios uitableview uinavigationcontroller segue


【解决方案1】:

您可以使用的一种可能的权宜之计是实施

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

并使用布尔标志或其他东西来指示您当前正在尝试执行该转场。例如:

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
}

【讨论】:

    【解决方案2】:

    Apple 在 iOS 7 中已修复此问题。

    对于以前版本的操作系统,Dan F's answer 应该可以解决问题。

    【讨论】:

    • 我现在在 iOS 12 上并且看到了这个,所以除非重新引入这个错误,否则我不相信这个评论是准确的。为澄清起见,我在didSelectRowAtIndexPath 内手动调用performSegue
    猜你喜欢
    • 2012-12-09
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 2013-01-31
    相关资源
    最近更新 更多