Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在shoulPerformSegue中显示UIAlertViewController_Ios_Swift_Uikit_Uistoryboardsegue_Uialertcontroller - Fatal编程技术网

Ios 在shoulPerformSegue中显示UIAlertViewController

Ios 在shoulPerformSegue中显示UIAlertViewController,ios,swift,uikit,uistoryboardsegue,uialertcontroller,Ios,Swift,Uikit,Uistoryboardsegue,Uialertcontroller,在我的项目中,我设置了一个UITableView,它的单元格绑定到一个segue,该segue将用户带到另一个ViewController,在那里可以详细显示单元格中的数据。但是,并非所有单元格都应执行该顺序(例如,单元格中显示的记录无效且不应显示,因此无需转到详细控制器) 对于这个任务,我使用UIViewController的shouldPerformSegue方法:(在下面的代码片段中,我假设表中的第二行是不应该执行segue的行) 这导致了一些奇怪的行为:每当我点击第二行时,警报只会在点击

在我的项目中,我设置了一个UITableView,它的单元格绑定到一个segue,该segue将用户带到另一个ViewController,在那里可以详细显示单元格中的数据。但是,并非所有单元格都应执行该顺序(例如,单元格中显示的记录无效且不应显示,因此无需转到详细控制器)

对于这个任务,我使用UIViewController的
shouldPerformSegue
方法:(在下面的代码片段中,我假设表中的第二行是不应该执行segue的行)

这导致了一些奇怪的行为:每当我点击第二行时,警报只会在点击一两秒后显示,有时甚至在点击五秒钟后显示,有时在我执行其他UI操作(如滚动表视图或再次点击)之前,警报根本不会显示

经过一些尝试和错误后,我找到了一个解决方案:当我将警报强制到主线程时,点击“错误”单元格后,警报将立即显示:

DispatchQueue.main.async {
    present(alert, animated: true, completion: nil)
}

这与我的直觉相反,因为
prepareforsgue
方法已经在主线程上执行。因此,我的问题是:UIAlertController的不稳定行为从何而来?我是否需要强制在主线程上显示它,还是我做错了什么?

这并不是因为
应该执行segue
不在主队列上,而是这个函数参与了segue进程,因此,在这一点上提出另一种观点是个坏主意

通过使用异步调度,您可以在出现警报之前完成(或在本例中中止)当前segue进程


我认为这是解决您问题的合理方法。

这并不是因为
shouldPerformSegue
不在主队列中,而是因为segue过程中涉及到该函数,所以在这一点上提出另一种观点是个坏主意。通过使用异步调度,您可以使当前segue进程在警报出现之前完成(或在本例中中止)。这是解决您问题的正确方法。就我个人而言,我会检查tableView(uu:didSelectRowAt:)委托方法中的数据,然后再执行segue。是的,我同意Tom的看法,我会检查didSelectRowAt中的行,如果需要,只在需要时调用performsguewithidentifier。@TomWolters这是我以前一直在做的,但是我尝试将尽可能多的视图逻辑移动到Interface Builder,并基于签入
tableView(:didSelectRowAt:)
执行该序列需要在代码中使用
performsgue(带标识符:sender:)启动它
-虽然我的大部分对话都是使用IB自动启动的。@Paulw11您的评论可能是我最接近答案的,如果您将其作为答案发布在下面,我会将其标记为接受。很好的解释,我们必须避免在shouldPerform中使用UIAlert。调度员没有解决我的问题,但很容易将按钮的直接序列转换为ViewController的序列;然后在UIAlert按钮的处理程序中从iAction执行查询。
DispatchQueue.main.async {
    present(alert, animated: true, completion: nil)
}