视图控制器演示 Swift 3

Posted

技术标签:

【中文标题】视图控制器演示 Swift 3【英文标题】:ViewController Presentation Swift 3 【发布时间】:2017-02-15 19:41:14 【问题描述】:

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

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)
    

    ...

每次选择行时都会调用上述两种当前视图控制器方法,但有时不会在第一次选择时出现(或者至少它们不可见)。对这个谜团的任何帮助都会很棒。

-谢谢

【问题讨论】:

【参考方案1】:

您必须先取消选择该行。在演示之前添加:

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

确实,这对我来说也是个谜。但这帮助我在不久前让它工作,我希望它也对你有用。

【讨论】:

哇,它有效。非常感谢你!我认为我在早期版本的 Swift 中没有这个问题,但我可能错了。 我不确定这是否是 Swift 3 的东西,但它发生在我身上很多次。将其标记为正确,以便每个人都可以知道这是修复它 谢谢。我不得不 *** 如何标记为正确。不是很明显。【参考方案2】:

使用我的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.1 怎么办?该应用程序将崩溃。为什么最推荐使用这个而不是取消选择行? @JuanCurti 这与时间无关;这是关于线程的。因此,即使是更短的延迟也能可靠地工作。我在这里使用的技术是我们退出主线程并允许运行循环完成,并在下一个运行循环中返回主线程。我们保证我们所在的方法 - didSelect - 将完成并且整个调用堆栈将完成,因为在此之前我们将无法返回主线程.到那时,并且只有,我们可以安全地开始演示了。

以上是关于视图控制器演示 Swift 3的主要内容,如果未能解决你的问题,请参考以下文章

返回上一个 ViewController 不适用于 Swift 中的多个视图控制器

swift 3 - 未显示子类视图控制器

2 在一个视图控制器中使用 Swift 3 的表视图

Swift 3 - UIPageViewController - 不鼓励在分离的视图控制器上呈现视图控制器

关闭模式视图控制器偶尔冻结应用程序,swift 3

Swift 3 在页面视图控制器中嵌入按钮