【问题标题】:Navigate to next view controller after delay ios延迟 ios 后导航到下一个视图控制器
【发布时间】:2018-02-16 17:45:45
【问题描述】:

我想在延迟 3 秒后导航到下一个视图控制器。它发生了,但它发生了两次!这是我的代码。

override func viewWillAppear(_ animated: Bool) {
    let authToken =  UserDefaults.standard.object(forKey:"token") as? String ?? ""


    if (authToken.characters.count == 0) {
        self.perform(#selector(ClassName.navigateToMobileScreen), with: nil, afterDelay: 3)
    }
}

我在不同的场景中将它放在 viewDidLoad 和 viewDidAppear 中。这可能是什么问题?

【问题讨论】:

  • 你应该把viewDidLoad和viewDidAppear的代码。因为我认为问题可能仅存在于该场景定义中。
  • 检查您在 viewDidLoad 和 viewDidAppear 中的逻辑...并确保它按预期工作。
  • 同时添加viewDidLoad的代码
  • 之前我在 viewDidLoad 中添加了相同的代码,现在 viewDidLoad 里面什么都没有
  • 那么它可能只推送一次,对吗?唯一剩下的就是延迟推送?

标签: ios swift timer uiviewcontroller selector


【解决方案1】:

使用以下代码加载下一个视图控制器,并从您想要的任何位置调用此loadNextVC 方法(viewDidLoadviewWillAppear 或任何其他方法)

func loadNextVC() {

    DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) {
    // Code to push/present new view controller
    }
}

【讨论】:

  • 也试过了,结果还是一样。但是当我只放置没有计时器的代码时,它可以工作
  • 我认为你犯了一些错误..否则上面的代码工作得很好..我已经在我的许多项目中使用过..并且工作得很好
  • 如果您可以分享整个文件.. 那么我可能可以帮助您/指出您正在做的错误
【解决方案2】:

使用布尔值确保推送下一个 ViewController 的代码只会推送一次。

var isNextVcPushed = false
func pushNextVc() {
    let authToken =  UserDefaults.standard.object(forKey:"token") as? String ?? ""
    if (authToken.characters.count == 0) {
        if !isNextVcPushed {
            isNextVcPushed = true
            self.perform(#selector(ClassName.navigateToMobileScreen), with: nil, afterDelay: 3)
        }
    }
}

在您需要的任何情况下调用此方法。它只会推送一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    • 2014-07-26
    • 2013-03-12
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多