ViewController 的实例给出错误“在展开可选值时发现 nil”

Posted

技术标签:

【中文标题】ViewController 的实例给出错误“在展开可选值时发现 nil”【英文标题】:Instance of a ViewController gives error "found nil while unwrapping an Optional value" 【发布时间】:2015-09-28 09:26:45 【问题描述】:

我正在尝试使用 Swift 2 将 MyChatController 加载到另一个控制器中。此代码在 Swift 1.2 中运行良好,但在更新到 Xcode 7 后,我的应用程序因以下错误而崩溃:

致命错误:在展开可选值时意外发现 nil

有人知道如何在 Swift 2 中解决这个问题吗?

 override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 


    let chatController: MyChatController = MyChatController()

    chatController.opponentImage = UIImage(named: "User")
    chatController.title = "My Chat"

    let helloWorld = ChatMessage(content: "Hello....!!", sentBy: .User)
    chatController.messages = [helloWorld]
    chatController.delegate = self
    chatController.hidesBottomBarWhenPushed = true

    self.navigationController?.pushViewController(chatController, animated: false)

  

【问题讨论】:

不确定,但您可以尝试为您的 let chatController 使用此语法:MyChatController = MyChatController()! self.navigationController!.pushViewController(chatController, animated: false) 这到底发生在哪一行? 是的,我已经尝试了所有可能的方法,但它不起作用..@mrunal 谢谢 @Nishant 在这一行错误被触发 let chatController: MyChatController = MyChatController() 那么 MyChatController() 返回 nil 吗?我们可能需要查看它的来源。 【参考方案1】:

我已经浏览了您的代码。 有一个错误。请执行以下步骤。

    转到 StretchyTextView 中名为 align 的方法。 在这种方法中,您试图解开 nil (self.selectedTextRange?.end)!。最初 selectedTextRange 将为 nil。

    所以在方法的开头如果 self.selectedTextRange 为 nil 则返回。

    函数对齐()

    if self.selectedTextRange == nil 
        return
    
    
    let caretRect: CGRect = self.caretRectForPosition(self.selectedTextRange!.end)
    
    let topOfLine = CGRectGetMinY(caretRect)
    let bottomOfLine = CGRectGetMaxY(caretRect)
    
    let contentOffsetTop = self.contentOffset.y
    let bottomOfVisibleTextArea = contentOffsetTop + CGRectGetHeight(self.bounds)
    
    /*
    If the caretHeight and the inset padding is greater than the total bounds then we are on the first line and aligning will cause bouncing.
    */
    
    let caretHeightPlusInsets = CGRectGetHeight(caretRect) + self.textContainerInset.top + self.textContainerInset.bottom
    if caretHeightPlusInsets < CGRectGetHeight(self.bounds) 
        var overflow: CGFloat = 0.0
        if topOfLine < contentOffsetTop + self.textContainerInset.top 
            overflow = topOfLine - contentOffsetTop - self.textContainerInset.top
         else if bottomOfLine > bottomOfVisibleTextArea - self.textContainerInset.bottom 
            overflow = (bottomOfLine - bottomOfVisibleTextArea) + self.textContainerInset.bottom
        
        self.contentOffset.y += overflow
    
    

【讨论】:

以上是关于ViewController 的实例给出错误“在展开可选值时发现 nil”的主要内容,如果未能解决你的问题,请参考以下文章

在 swiftUI 中加载图像在展开时导致 nil

从 SceneDelegate 获取 viewController 实例化的错误

无法在 Swift 中获取 UITextField 的 .text 属性 - 错误:“实例成员 'textFieldName' 不能用于类型 'ViewController'

运行时错误消息:loadView 使用来自故事板 Main 的标识符 ViewController 实例化视图控制器,但没有获得 TableView

ViewController respondsToSelector:]: 消息发送到释放的实例

Android - 包含 ExpandableListView 的 NestedScrollView 在展开时不会滚动