在函数运行时显示UIView / UIImage / UITextView

时间:2016-11-26 18:52:51

标签: ios swift uiview uiimage activity-indicator

目的

我正在尝试在函数运行时显示UIView,UIImage和UITextView,以便让用户知道它正在处理(类似于活动指示器,但更加自定义)。

问题

当下面的代码正在处理时,UIView,UIImage和UITextView直到功能完成运行之前不显示(而不是显示功能开始运行,隐藏功能完成)。

当前的方法:

我创建了一个UIView(loadingView),其中包含和image(loadingIcon)以及一个textView(loadingText),向用户解释应用正在处理的内容。

我还创建了一个名为isLoading的函数,它显示或隐藏所有3个,而不是多次重复这些行。我已经在viewDidLoad中测试了将isLoading设置为true和false以确保它正常工作。

@IBOutlet weak var loadingView: UIView!
@IBOutlet weak var loadingIcon: UIView!
@IBOutlet weak var loadingText: UIView!

override func viewDidLoad() {
    super.viewDidLoad()
    isLoading(false)
}


func isLoading(_ loadStatus: Bool) {
    if loadStatus == true {
        loadingView.isHidden = false
        loadingIcon.isHidden = false
        loadingText.isHidden = false
    } else {
        loadingView.isHidden = true
        loadingIcon.isHidden = true
        loadingText.isHidden = true
    }
}

@IBAction func sendButtonPressed(_ sender: AnyObject) {
    isLoading(true)

    ... //process information, which takes some time

    isLoading(false)
}

非常感谢任何帮助,建议或想法。谢谢。

1 个答案:

答案 0 :(得分:0)

您正在主队列上运行该进程,因此您的UI似乎会挂起,直到完成为止。您需要在后台处理信息。您可能会使用的常见模式是:

@IBAction func sendButtonPressed(_ sender: AnyObject) {
    isLoading(true)

    // Do the processing in the background    
    DispatchQueue.global(qos: .userInitiated).async {
        ... //process information, which takes some time

        // And update the UI on the main queue
        DispatchQueue.main.async {
            isLoading(false)
        }
    }
}