Swift 项目以 NSException 类型的未捕获异常终止

Posted

技术标签:

【中文标题】Swift 项目以 NSException 类型的未捕获异常终止【英文标题】:Swift Project Terminating with uncaught exception of type NSException 【发布时间】:2016-05-10 09:54:28 【问题描述】:

无法识别的选择器发送到实例 0x7feca9469620 2016-05-10 19:34:58.781 TribeA2[76123:4834825] *** 由于以下原因而终止应用程序 未捕获的异常“NSInvalidArgumentException”,原因: '-[TribeA2.RegisterPageViewController registerButtonTapped:]: 无法识别的选择器发送到实例 0x7feca9469620'

NSException 类型的未捕获异常终止。

import UIKit

class RegisterPageViewController: UIViewController 



@IBOutlet weak var userFirstNameTextField: UITextField!
@IBOutlet weak var userLastNameTextField: UITextField!
@IBOutlet weak var userEmailTextField: UITextField!
@IBOutlet weak var userPasswordTextField: UITextField!


var databasePath = NSString()

override func viewDidLoad() 
    super.viewDidLoad()
    let filemgr = NSFileManager.defaultManager()
    let dirPaths =
        NSSearchPathForDirectoriesInDomains(.DocumentDirectory,
                                            .UserDomainMask, true)

    let docsDir = dirPaths[0]

    databasePath = (docsDir as NSString).stringByAppendingPathComponent(
        "users.db")

    if !filemgr.fileExistsAtPath(databasePath as String) 

        let userDB = PersonDatabase(path: databasePath as String)

        if userDB == nil 
            print("Error: \(userDB.lastErrorMessage())")
        

        if userDB.open() 
            let sql_stmt = "CREATE TABLE IF NOT EXISTS USERS (ID INTEGER PRIMARY KEY AUTOINCREMENT, FNAME TEXT, LNAME TEXT, EMAIL TEXT, PASSWORD TEXT)"
            if !userDB.executeStatements(sql_stmt) 
                print("Error: \(userDB.lastErrorMessage())")
            
            userDB.close()
         else 
            print("Error: \(userDB.lastErrorMessage())")
        
    





@IBAction func saveData(sender: AnyObject) 
    let userDB = PersonDatabase(path: databasePath as String)

    if userDB.open() 

        func displayMyAlertMessage(userMessage:String)
        
            let myAlert = UIAlertController(title:"Alert", message:
                userMessage, preferredStyle:
                UIAlertControllerStyle.Alert);

            let okAction = UIAlertAction(title:"Ok", style:
                UIAlertActionStyle.Default, handler:nil)

            myAlert.addAction(okAction)

            self.presentViewController(myAlert, animated:true,
                                       completion:nil)

        


        let insertSQL = "INSERT INTO USERS (fname, lname, email, password) VALUES ('\(userFirstNameTextField.text)', '\(userLastNameTextField.text)' '\(userEmailTextField.text)', '\(userPasswordTextField.text)')"

        let result = userDB.executeUpdate(insertSQL, withArgumentsInArray: nil)

        if !result 
            displayMyAlertMessage("All fields are required")
            print("Error: \(userDB.lastErrorMessage())")
            return
         else 
           displayMyAlertMessage("Thank you for registering \(userFirstNameTextField.text)")
    

【问题讨论】:

【参考方案1】:

RegisterPageViewController 中,您创建了registerButtonTapped 按钮操作,但未实现按钮方法,如果您未使用registerButtonTapped 从属性检查器中删除,否则在类上实现按钮操作,如下所示

func registerButtonTapped(sender: UIButton)
    
   

【讨论】:

【参考方案2】:

在界面构建器中,如果您右键单击该按钮,将显示一个弹出窗口,您可以在其中看到您已将名称-registerButtonTapped: 连接到您的类的“操作”,但实际上您还没有实现该方法(或者您出于某种原因将其删除)。因此,您必须通过单击该弹出窗口中的 x 按钮来删除该连接,或者实现 -registerButtonTapped: 方法。

【讨论】:

【参考方案3】:

如果您右键单击按钮,按钮将显示关联的操作或变量。请检查它是否在您的控制器中可用

【讨论】:

以上是关于Swift 项目以 NSException 类型的未捕获异常终止的主要内容,如果未能解决你的问题,请参考以下文章

以 NSException Timer Swift Crash 类型的未捕获异常终止

Swift 2 到 3 迁移错误(libc++abi.dylib:以 NSException 类型的未捕获异常终止)

从 Swit2.3 到 Swift3 的转换导致“以 NSException 类型的未捕获异常终止”

(Swift 3) 父子上下文崩溃核心数据 (libc++abi.dylib: 以 NSException (Recorded Frame) 类型的未捕获异常终止)

以 NSException 类型的未捕获异常终止 - 删除表视图行

以 NSException (lldb) 类型的未捕获异常终止