首页 文章

UIView.init()必须仅从主线程使用(当我转到此控制器时)

提问于
浏览
0

你好,这是我的控制器类

class  passwordViewController: UIViewController {

 let load = UIActivityIndicatorView(style: .whiteLarge) // cause error

 let passwordTextFiled:UITextField = { // cause error

            let pass = UITextField()
            pass.placeholder = ""
            pass.addDoneButtonOnKeyboard()
            pass.textColor = .gray
            pass.textAlignment = NSTextAlignment.center
            return pass
        }()

        let barLabel:UILabel = {
            let bar = UILabel()
            bar.text=""
            bar.backgroundColor = Colors.yellow
            return bar
        }()
         // there is more code here.i avoid to copy
}

当我直接运行这个控制器时,没有错误 . 但是当我从其他控制器发出错误时会导致此错误

UIView.init()只能从主线程使用

更新1:

有一个带有一个按钮的控制器,按钮可以转到控制器B.

这是我的segue代码:

DispatchQueue.main.async {

            self.performSegue(withIdentifier: "passVC", sender: nil)

           }

我在这里有B控制器代码swift 4和代码10

2 回答

  • 0

    该错误告诉您正在从后台线程创建视图控制器,并且必须在主线程上创建它(所有UI工作必须在主线程上完成) .

    因此,当您在后台线程中并且想要执行UI工作时,您应该使用调度队列调用来在正确的线程中运行代码 .

    DispatchQueue.main.async {
       // UI work here
    }
    

    所以在你的情况下,我想你正在做一些网络请求来检查身份验证 .

    networkService.checkAuth() { auth in 
         // do whatever NON UI work you need to here
         DispatchQueue.main.async {
             // UI work here
         }
    }
    
  • 2
    DispatchQueue.main.async {
    

    //将你的segue代码从另一个控制器移动到密码控制器

    }

相关问题