草庐IT

关于 ios:Crash when found nil while implicitly unwrapping an Optional value that is not nil

codeneng 2023-03-28 原文

Crash when found nil while implicitly unwrapping an Optional value that is not nil

我正在使用 Firebase 开发一个 iOS 数据库应用。在身份验证(成功执行)之后,userUID 从我的 LoginViewController 传递到我的 HomeViewController。然后,在我的 HomeViewController 中,我使用用户的 UID 从与该 UID 关联的 Cloud Firestore 获取用户的其余信息。检索后,我想在标签中显示名字和姓氏。我确定信息检索成功并且我确实有两个字符串(名字和姓氏)。当我在控制台中打印它们时,我得到的正是我想要的。但我不知道为什么,当我尝试在标签中显示此类字符串时,出现以下错误:

Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value: file /Users/fafa/Documents/Advisory Program/Advisory Program/HomeViewController.swift, line 41

我已经尝试了几件事,但我似乎无法解决这个问题。这是我的代码的一部分:

LoginViewController.swift

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@IBAction func loginTapped(_ sender: Any) {
   
    let error = validateFields()
   
    if error != nil {
       
        showErrorMessage(error!)
       
    } else {
       
        let email = emailTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
        let password = passwordTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
       
        Auth.auth().signIn(withEmail: email, password: password) { (result, error) in
           
            if error != nil {
               
                self.showErrorMessage(error!.localizedDescription)
           
            } else {
               
                let homeViewController = self.storyboard?.instantiateViewController(withIdentifier:"HomeVC") as? HomeViewController
                self.navigationController?.pushViewController(homeViewController!, animated: true)
               
                homeViewController!.userUID = result!.user.uid
               
            }
        }
    }
}

HomeViewController.swift

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
override func viewDidLoad() {
    super.viewDidLoad()
   
    let db = Firestore.firestore()
    db.collection("teachers").whereField("uid", isEqualTo: userUID).getDocuments { (snapshot, error) in
   
        if let error = error {
                   
            print("Error getting documents: \\(error)")
                   
        } else {

            for document in snapshot!.documents {

                // Error gets printed in the following line
                TeacherHeaderCollectionReusableView().teacherNameLabel.text ="\\(document.get("firstName") ??"default value") \\(document.get("lastName") ??"default value")"

                print("\\(document.documentID) => \\(document.data())")
            }
        }
    }
}

TeacherHeaderCollectionReusableView.swift

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class TeacherHeaderCollectionReusableView: UICollectionReusableView {

    @IBOutlet weak var teacherHeaderView: UIView!
    @IBOutlet weak var teacherPhoto: UIImageView!
    @IBOutlet weak var teacherNameLabel: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
       
        //teacherHeaderView.backgroundColor = UIColor.init(red: 140/255, green: 3/255, blue: 3/255, alpha: 1)
        let blurEffect = UIBlurEffect(style: .dark)
        let blurEffectView = UIVisualEffectView(effect: blurEffect)
        blurEffectView.frame = teacherHeaderView.bounds
        blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        teacherHeaderView.insertSubview(blurEffectView, at: 0)
        teacherHeaderView.layer.cornerRadius = 10.0
        teacherHeaderView.layer.masksToBounds = true
   
        teacherPhoto.layer.cornerRadius =  teacherPhoto.frame.width/2.0
        teacherPhoto.clipsToBounds = true
        teacherNameLabel.textColor = .white
    }

    func configure(image:UIImage, name:String) {
        teacherPhoto.image = image
        teacherNameLabel.text = name
    }

    static func nib() -> UINib {
        return UINib(nibName:"TeacherHeaderCollectionReusableView", bundle: nil)
    }

}

  • 您犯了一个常见错误: TeacherHeaderCollectionReusableView() 始终创建控制器的新实例,该实例不是情节提要中的实例,因此未连接出口。即使它是正确的实例,它也会崩溃,因为视图尚未加载。在任何情况下,您都需要通过故事板中的 segue 或实例化来实际实例..


这里 UILabel 类型的 teacherNameLabelnil。您必须从 xib 初始化 TeacherHeaderCollectionReusableView 以避免崩溃。在这一行中: TeacherHeaderCollectionReusableView().teacherNameLabel.text 您正在尝试使用空的初始值设定项来创建 TeacherHeaderCollectionReusableView 的新实例。使用空的初始化程序不会加载您在界面构建器中创建的子视图。这是一个如何正确初始化 TeacherHeaderCollectionReusableView 的示例。

1
2
3
let nib = UINib(nibName:"TeacherHeaderCollectionReusableView", bundle: nil)
let teacherHeaderCollectionReusableView = nib.instantiate(withOwner: nil, options: nil)[0] as? TeacherHeaderCollectionReusableView
teacherHeaderCollectionReusableView?.teacherNameLabel.text ="..."

有关关于 ios:Crash when found nil while implicitly unwrapping an Optional value that is not nil的更多相关文章

  1. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  2. ruby-on-rails - Rails 中的 NoMethodError::MailersController#preview undefined method `activation_token=' for nil:NilClass - 2

    似乎无法为此找到有效的答案。我正在阅读Rails教程的第10章第10.1.2节,但似乎无法使邮件程序预览正常工作。我发现处理错误的所有答案都与教程的不同部分相关,我假设我犯的错误正盯着我的脸。我已经完成并将教程中的代码复制/粘贴到相关文件中,但到目前为止,我还看不出我输入的内容与教程中的内容有什么区别。到目前为止,建议是在函数定义中添加或删除参数user,但这并没有解决问题。触发错误的url是http://localhost:3000/rails/mailers/user_mailer/account_activation.http://localhost:3000/rails/mai

  3. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  4. ruby-on-rails - `a ||= b` 和 `a = b if a.nil 之间的区别? - 2

    我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行

  5. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  6. ruby 语法糖 : dealing with nils - 2

    可能已经问过了,但我找不到它。这里有2个常见的情况(对我来说,在编程Rails时......)用ruby​​编写是令人沮丧的:"astring".match(/abc(.+)abc/)[1]在这种情况下,我得到一个错误,因为字符串不匹配,因此在nil上调用[]运算符。我想找到的是比以下内容更好的替代方法:temp="astring".match(/abc(.+)abc/);temp.nil??nil:temp[1]简而言之,如果不匹配,则简单地返回nil而不会出错第二种情况是这样的:var=something.very.long.and.tedious.to.writevar=some

  7. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  8. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  9. ruby-on-rails - Ruby 流量控制 : throw an exception, 返回 nil 还是让它失败? - 2

    我在思考流量控制的最佳实践。我应该走哪条路?1)不要检查任何东西并让程序失败(更清晰的代码,自然的错误消息):defself.fetch(feed_id)feed=Feed.find(feed_id)feed.fetchend2)通过返回nil静默失败(但是,“CleanCode”说,你永远不应该返回null):defself.fetch(feed_id)returnunlessfeed_idfeed=Feed.find(feed_id)returnunlessfeedfeed.fetchend3)抛出异常(因为不按id查找feed是异常的):defself.fetch(feed_id

  10. ruby - 将对象设置为 nil 是否很常见? - 2

    我正在构建一个应用程序,想知道是否将未使用的对象设置为nil是生产级编码中的常见做法。我知道这只是垃圾收集器的提示,并不总是处理对象。 最佳答案 根据这个thread如果您使用完一个成员对象,将其设置为nil将引发被引用对象被垃圾回收。如果它是局部变量,方法exit将做同样的事情。也就是说,如果您要求将成员显式设置为nil,我会质疑您的设计。 关于ruby-将对象设置为nil是否很常见?,我们在StackOverflow上找到一个类似的问题: https://

随机推荐