ViewController演示Swift 3

问题描述:

我的代码在用户触摸表格视图中的一行时以编程方式呈现视图控制器。代码驻留在“didSelectRowtIndex”路径中,表视图驻留在ViewController类中,在该类中实现了表视图代表。我遇到的问题是我试图呈现的视图控制器只出现在表格视图行的第二次触摸上。但是,当父视图控制器首次加载时,它们会在第一次触摸时出现。下面是对两个子视图控制器的呈现在“didSelectRowAtIndexPath方法”的代码:ViewController演示Swift 3

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    if indexPath.row == 0 { 

     let stockTable = StockTableVC() 
     self.present(stockTable, animated: false, completion: nil) 
    } 

    else indexPath.row == 1 { 

     let accountTable = AccountTableVC() 
     self.present(accountTable, animated: false, completion: nil) 
    } 

    ... 

两个本视图控制器方法以上被呼吁行选择每一次,但somtimes没有提出关于第一次选择(或者至少它们不可见)。任何有关这个谜的帮助都会很棒。

-Thanks

用我delay功能(记录here):

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    if indexPath.row == 0 { 
     let stockTable = StockTableVC() 
     delay(0.1) { 
      self.present(stockTable, animated: false, completion: nil) 
     } 
    } 
    // ... and so on ... 
} 

这使选择过程一次启动演示文稿之前完成。

+0

有趣。谢谢,上面的取消选择行解决方案很好,但如果我遇到问题,我会尝试后者。 – jdeckman

+0

如果延迟超过0.1,该怎么办?该应用会崩溃。为什么大多数建议使用这个比取消选择行? –

+1

@JuanCurti这不是关于时机;这是关于线程。因此,即使较短的延迟也能可靠地工作。我在这里使用的技术是我们退出主线程并允许runloop完成,并在下一个runloop的主线程中返回。我们保证,我们在''didSelect'中的方法已经完成,整个调用堆栈将完成,因为直到发生这种情况,我们将无法回到主线程。而在那个时候,只有在这一点上,我们可以安全地开始介绍。 – matt

您必须先取消选择该行。在介绍前加入:

tableView.deselectRow(at: indexPath, animated: false) 

对我来说,这也是一种莫名的感觉。但是这帮助我在早些时候开始工作,我希望它也适用于您。

+0

哇,它的工作原理。非常感谢你!我认为在早期版本的Swift中我没有遇到这个问题,但我可能是错的。 – jdeckman

+0

我不确定这是不是Swift 3的东西,但它发生在我身上很多次。将其标记为正确,以便每个人都可以了解到此问题已修复此问题 –

+0

谢谢。我不得不通过*如何标记为正确。这不是很明显。 – jdeckman