【问题标题】:How to prevent performing the same segue twice?如何防止两次执行相同的segue?
【发布时间】:2015-12-29 08:49:49
【问题描述】:

我的 iOS 应用程序出现导航问题。我有带有菜单项表格视图的滑动菜单。点击其中一个项目会触发 segue,它将新的视图控制器推入堆栈。问题是我可以在同一个堆栈上两次推送同一个视图控制器。如果我选择菜单项“A”,则将相应的视图控制器推送到导航堆栈上。从这个新推送的视图控制器中,我还可以选择相同的“A”菜单项并推送与最顶层视图控制器相同类的新距离。我怎样才能防止这种情况?

无效的解决方案:
检查导航堆栈顶部控制器的类。但问题是我只知道 segue 的标识符(NSString* 对象),无法获取有关目标视图控制器类的信息。我可以检查该类的唯一地方是方法:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

但我无法阻止执行此方法的转场。

我尝试在属性中保存上次执行的 segue,但它不起作用,因为当我按下“A”视图控制器,然后按下“B”视图控制器,然后按下返回按钮时,我将无法再次按下 B错了:)

【问题讨论】:

  • 我通过检查堆栈中的 ViewControllers 数组来管理类似的东西。 self.navigationController.viewControllers

标签: ios objective-c segue uistoryboard uistoryboardsegue


【解决方案1】:

你需要以下方法

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

只需返回 false 即可取消转场。你会有这样的东西(伪代码):

if ([performedSeguesArray contain:identifier])
{
     return NO;
}
else
{
    [performedSeguesArray addObject:identifier];
}

return YES;

【讨论】:

  • 是的,我知道这种方法。但是里面有什么逻辑。正如我所写的那样,我无法获得即将执行的 segue 目标视图控制器的类。
  • 您可以为所有视图控制器创建父类,您将在其中保存所有执行的 segue 标识符。而且你应该检查活动的segue是否在执行列表中,那么它应该被取消
  • 但是“shouldPerformSegueWithIdentifier”方法不会经常调用,所以我们必须添加一些条件。 if ([self shouldPerformSegueWithIdentifier:@"" sender:nil]) { [self performSegueWithIdentifier:@"" sender:self]; }
  • 什么意思,每次使用segue时shouldPerformSegueWithIdentifier都会调用
【解决方案2】:

我遇到了同样的问题,现在已经解决了。如果这有帮助,请告诉我。

我已经有一个从表格视图单元格链接到另一个名为 DynamicSuperView 的视图

func tableView(_tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
{
//Remove the below line from this function as it will perform segue.
//performSegue(withIdentifier: "DynamicSegue", sender: self)
}


override func prepare(for segue: UIStoryboardSegue, sender: AnyObject?)         {
// This will actually perform your segue
var DestViewController = segue.destination as! DynamicSuperView 
let selectedRow = tableView.indexPathForSelectedRow?.row
DestViewController.labelText = names[selectedRow!]
}

【讨论】:

    猜你喜欢
    • 2017-02-26
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    • 2018-04-26
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多