首页 > 解决方案 > 视图不显示

问题描述

我有一个警报框,它接受用户输入并启动下载任务。用户单击“确定”后,我希望屏幕显示一个 UIView,我在下载时添加了一个 ActivityIndi​​cator。下载成功并且该函数正确打开了下一个控制器,但是,自定义视图和活动指示器永远不会显示。这是我的代码:

private func getKeyFromAlert() {
    let alert = UIAlertController(title: "Enter Key", message: "Enter your text key below.  If you want to scan it instead, click \"Scan Key.\" ", preferredStyle: .alert)

    alert.addTextField { (textField) in
        let attribString = NSAttributedString(string: "Enter your app code here")
        textField.attributedPlaceholder = attribString
    }

    let scanAction = UIAlertAction(title: "Scan Key", style: .default) { _ in
        self.openSettingsForApp()
    }
    let okAction = UIAlertAction(title: "OK", style: .default) { _ in
        let textField = alert.textFields![0]
        if let text = textField.text {
            let encoded = text.toBase64()
            let status = APIKeychain.storeToken(encoded)
            if !status {
                self.displayAlertForBadKeychain(useCamera: false)
            } else {
                self.addLoader()
                self.dismissSetup()
            }
        } else {
            let _ = APIKeychain.storeToken("")
            self.addLoader()
            self.dismissSetup()
        }
    }

    alert.addAction(scanAction)
    alert.addAction(okAction)
    show(alert, sender: nil)
}

我用来显示 UIView 的有问题的函数是addLoader() 代码addLoader

private func addLoader() {
    let frame = CGRect(x: 0, y: 0, width: view.bounds.width, height: view.bounds.height)
    let loaderView = UIView(frame: frame)
    loaderView.alpha = 1.0
    loaderView.backgroundColor = UIColor.white
    let activitySpinner: UIActivityIndicatorView = UIActivityIndicatorView(frame: loaderView.frame)
    activitySpinner.center = loaderView.center
    activitySpinner.hidesWhenStopped = false
    activitySpinner.style = .whiteLarge
    activitySpinner.startAnimating()
    loaderView.addSubview(activitySpinner)
    self.view.addSubview(loaderView)
    self.view.layoutIfNeeded()
}

我已经尝试了几次迭代setNeedsDisplay并且setNeedsLayout没有运气。我也尝试过在DispatchQueue.main.async没有任何影响的情况下明确声明这一点。

编辑 我添加了下面的代码dismissSetup()

private func dismissSetup() {
    let dispatchGroup = DispatchGroup()
    dispatchGroup.enter()
    DispatchQueue.global(qos: .background).async {
        if self.updateDatabase {
            //This will start the download process
            let _ = WebDataFetcher(dataStack: self.dataStack)
        }
        dispatchGroup.leave()
    }
    dispatchGroup.wait()
    let mainSB = UIStoryboard(name: "UserInputs", bundle: nil)
    let mainVC = mainSB.instantiateViewController(withIdentifier: "userInputs")
    appDelegate.window?.rootViewController = mainVC
}

标签: iosswiftuiviewswift4

解决方案


推荐阅读