【问题标题】:Swift 3 - Thread 1: Signal SIGABRTSwift 3 - 线程 1:信号 SIGABRT
【发布时间】:2017-02-13 00:02:05
【问题描述】:

我正在尝试通过单击按钮更改模拟器中的视图,但不断收到错误消息:

线程 1:信号 SIGABRT

我知道这通常发生在与插座或操作断开连接时,但我检查过它们似乎都已链接。

AppDelegate.swift

import UIKit
import Parse

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?


private func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.

    // Parse configuration in Heroku
    let configuration = ParseClientConfiguration {

        // accessing Heroku App via ID and Keys
        $0.applicationId = "truegramIDDB91"
        $0.clientKey = "truegramKeyDB91"
        $0.server = "http://truegram.herokuapp.com/parse"
    }

    // call login function
    login()

    Parse.initialize(with: configuration)
    return true
}


func applicationWillResignActive(_ application: UIApplication) {
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}

func applicationDidEnterBackground(_ application: UIApplication) {
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}

func applicationWillEnterForeground(_ application: UIApplication) {
    // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}

func applicationDidBecomeActive(_ application: UIApplication) {
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}

func applicationWillTerminate(_ application: UIApplication) {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}

func login() {

    // remember user's login
    let username : String? = UserDefaults.standard.string(forKey: "username")

    // if logged in
    if username != nil {

        let storyboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let myTabBar = storyboard.instantiateViewController(withIdentifier: "tabBar") as! UITabBarController
        window?.rootViewController = myTabBar

    }


}

}

SignInVC.swift

import UIKit
import Parse

class signInVC: UIViewController {

// textfields
@IBOutlet weak var usernameTxt: UITextField!
@IBOutlet weak var passwordTxt: UITextField!
@IBOutlet weak var label: UILabel!

// sign in button view
@IBOutlet weak var signinBtnBlock: UIView!

// buttons
@IBOutlet weak var signInBtn: UIButton!
@IBOutlet weak var signUpBtn: UIButton!
@IBOutlet weak var forgotPasswordBtn: UIButton!

// default function
override func viewDidLoad() {
    super.viewDidLoad()

// font of label (Clubbr)
label.font = UIFont(name: "gillsans-light", size: 22)

}



// clicked sign in button
@IBAction func signInBtnClick(sender: AnyObject) {
    print("sign in pressed")

    // hide keyboard
    self.view.endEditing(true)


    // if text fields are empty
    if usernameTxt.text!.isEmpty || passwordTxt.text!.isEmpty {

        // show alert message
        let alert = UIAlertController(title: "Please", message: "fill in fields", preferredStyle: UIAlertControllerStyle.alert)
        let ok = UIAlertAction(title: "OK", style: UIAlertActionStyle.cancel, handler: nil)
        alert.addAction(ok)
        self.present(alert, animated: true, completion: nil)
    }


    // login functions
    PFUser.logInWithUsername(inBackground: usernameTxt.text!, password: passwordTxt.text!) { (user: PFUser?, error: Error?) -> Void in
        if error == nil {

            // remember user or save in app memory (did the user log in or not)
            UserDefaults.standard.set(user!.username, forKey: "username")
            UserDefaults.standard.synchronize()

            // Call login function from AppDelegate.swift class
            let appDelegate : AppDelegate = UIApplication.shared.delegate as! AppDelegate
            appDelegate.login()

        } else {

            // show alert message
            let alert = UIAlertController(title: "Error", message: error!.localizedDescription, preferredStyle: UIAlertControllerStyle.alert)
            let ok = UIAlertAction(title: "OK", style: UIAlertActionStyle.cancel, handler: nil)
            alert.addAction(ok)
            self.present(alert, animated: true, completion: nil)

        }

}



}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


}

SignUpVc.swift

import UIKit
import Parse

class signUpVC: UIViewController, UIImagePickerControllerDelegate,    UINavigationControllerDelegate {
// profile image
@IBOutlet weak var avaImg: UIImageView!

// textfields
@IBOutlet weak var firstnameTxt: UITextField!
@IBOutlet weak var lastnameTxt: UITextField!
@IBOutlet weak var emailTxt: UITextField!
@IBOutlet weak var passwordTxt: UITextField!
@IBOutlet weak var confirmTxt: UITextField!

// buttons
@IBOutlet weak var loginBtn: UIButton!
@IBOutlet weak var signupBtn: UIButton!
@IBOutlet weak var businessSignupBtn: UIButton!

// scroll view
@IBOutlet weak var scrollView: UIScrollView!


// resets scroll view to default size
var scrollViewHeight : CGFloat = 0

// keyboard frame size
var keyboard = CGRect()


// default func
override func viewDidLoad() {
    super.viewDidLoad()



    // check notifications if keyboard is shown or not
    NotificationCenter.default.addObserver(self, selector: Selector(("showKeyboard:")), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: Selector(("hideKeyboard:")), name: NSNotification.Name.UIKeyboardWillHide, object: nil)

    // declare hide keyboard tap
    let hideTap = UITapGestureRecognizer(target: self, action: Selector(("hideKeyboardTap:")))
    hideTap.numberOfTapsRequired = 1
    self.view.isUserInteractionEnabled = true
    self.view.addGestureRecognizer(hideTap)

     // profile image circle shape and custom border colour
    avaImg.layer.borderWidth = 2
    avaImg.layer.borderColor = UIColor.init(red: 90/255, green: 187/255, blue: 181/255, alpha: 1).cgColor
    avaImg.layer.cornerRadius = avaImg.frame.height/2
    avaImg.clipsToBounds = true

    // declare select image tap
    let avaTap = UITapGestureRecognizer(target: self, action: Selector(("loadImg:")))
    avaTap.numberOfTapsRequired = 1
    avaImg.isUserInteractionEnabled = true
    avaImg.addGestureRecognizer(avaTap)
}

// call picker to select image
func loadImg(recognizer: UITapGestureRecognizer) {

    let picker = UIImagePickerController()
    picker.delegate = self
    picker.sourceType = .photoLibrary
    picker.allowsEditing = true
    present(picker, animated: true, completion: nil)
}

// connect selected image to our image view
private func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
    avaImg.image = info[UIImagePickerControllerEditedImage] as? UIImage
    self.dismiss(animated: true, completion: nil)
}


// hide keyboard if tapped
func hideKeyboardTap(recognizer: UITapGestureRecognizer) {
    self.view.endEditing(true)
}

// show keyboard
func showKeyboard(notification: NSNotification) {

    // define keyboard sizes
    keyboard = ((notification.userInfo?[UIKeyboardFrameEndUserInfoKey]! as AnyObject).cgRectValue)!

    //move up UI
    UIView.animate(withDuration: 0.4) { () -> Void in
        self.scrollView.frame.size.height = self.scrollViewHeight - self.keyboard.height

    }

 }

// hide keyboard
func hideKeyboard(notification: NSNotification) {

    //move down UI
    UIView.animate(withDuration: 0.4) { () -> Void in
        self.scrollView.frame.size.height = self.view.frame.height

    }

}


// clicked sign up
@IBAction func signupBtnClick(sender: AnyObject) {
   print("sign up pressed")

    // dismiss keyboard
    self.view.endEditing(true)


    // if fields are empty
    if (emailTxt.text!.isEmpty || passwordTxt.text!.isEmpty || confirmTxt.text!.isEmpty || firstnameTxt.text!.isEmpty || lastnameTxt.text!.isEmpty) {

    // alert pop up message
    let alert = UIAlertController(title: "Please", message: "fill all fields", preferredStyle: UIAlertControllerStyle.alert)
    let ok = UIAlertAction(title: "OK", style: UIAlertActionStyle.cancel, handler: nil)
    alert.addAction(ok)
    self.present(alert, animated: true, completion: nil)

    }

    // if incorrect password
    if passwordTxt.text != confirmTxt.text {

    // alert pop up message
    let alert = UIAlertController(title: "Attention", message: "incorrect password", preferredStyle: UIAlertControllerStyle.alert)
    let ok = UIAlertAction(title: "OK", style: UIAlertActionStyle.cancel, handler: nil)
    alert.addAction(ok)
    self.present(alert, animated: true, completion: nil)

    }

    // send data to related columns in server
    let user = PFUser()
    user.username = emailTxt.text?.lowercased()
    user.email = emailTxt.text?.lowercased()
    user.password = passwordTxt.text
    user["firstname"] = firstnameTxt.text?.lowercased()
    user["lastname"] = lastnameTxt.text?.lowercased()

    // convert our image for sending to server
    let avaData = UIImageJPEGRepresentation(avaImg.image!, 0.5)
    let avaFile = PFFile(name: "ava.jpg", data: avaData!)
    user["ava"] = avaFile

    // save data in server
    user.signUpInBackground { (success: Bool, error: Error?) -> Void in
        if success {
            print("registered")

            // remember logged user
            UserDefaults.standard.set(user.username, forKey: "username")
            UserDefaults.standard.synchronize()

            // calls login func from AppDelegate.swift class
            let appDelegate : AppDelegate = UIApplication.shared.delegate as! AppDelegate
            appDelegate.login()

       } else {

            // show alert message
            let alert = UIAlertController(title: "Error", message: error!.localizedDescription, preferredStyle: UIAlertControllerStyle.alert)
            let ok = UIAlertAction(title: "OK", style: UIAlertActionStyle.cancel, handler: nil)
            alert.addAction(ok)
            self.present(alert, animated: true, completion: nil)

        }


    }

}

// clicked return to log in
@IBAction func loginBtnClick(sender: AnyObject) {
    self.dismiss(animated: true, completion: nil)

    // dismiss keyboard
    self.view.endEditing(true)

}


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}



}

ResetPasswordVC.swift

import UIKit
import Parse

class resetPasswordVC: UIViewController {

// text field
@IBOutlet weak var emailTxt: UITextField!

// buttons
@IBOutlet weak var cancelBtn: UIButton!
@IBOutlet weak var resetBtn: UIButton!

// clicked cancel button
@IBAction func cancelBtnClick(sender: AnyObject) {
    self.dismiss(animated: true, completion: nil)

    // dismiss keyboard
    self.view.endEditing(true)
}

// clicked reset button
@IBAction func resetBtnClick(sender: AnyObject) {

    // hide keyboard
    self.view.endEditing(true)

    // if email text field is empty
    if emailTxt.text!.isEmpty {

        // show alert message
        let alert = UIAlertController(title: "Email field", message: "is empty", preferredStyle: UIAlertControllerStyle.alert)
        let ok = UIAlertAction(title: "OK", style: UIAlertActionStyle.cancel, handler: nil)
        alert.addAction(ok)
        self.present(alert, animated: true, completion: nil)
    }

    // request for resetting password
    PFUser.requestPasswordResetForEmail(inBackground: emailTxt.text!) { (success: Bool, error: Error?) -> Void in
        if success {

            // show alert message
            let alert = UIAlertController(title: "Reset Password Email", message: "has been sent to the email address associated with your account", preferredStyle: UIAlertControllerStyle.alert)

            // of ok is pressed call self.dismiss.. function
            let ok = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: { (UIAlertAction) -> Void in
                self.dismiss(animated: true, completion: nil)
            })

            alert.addAction(ok)
            self.present(alert, animated: true, completion: nil)
        } else {
            print(error?.localizedDescription)

        }

    }

}

// default func
override func viewDidLoad() {
    super.viewDidLoad()

// tap to hide keyboard
let hideTap = UITapGestureRecognizer(target: self, action: Selector(("hideKeyboard:")))
hideTap.numberOfTapsRequired = 1
self.view.isUserInteractionEnabled = true
self.view.addGestureRecognizer(hideTap)

}

// hide keyboard function
func hideKeyboard(recognizer: UITapGestureRecognizer) {
    self.view.endEditing(true)

}
    override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}



}

我确信问题是相当明显的,但我只使用 Swift 3 个月,它是我的第一个编程语言。非常感谢您的帮助。

感谢您的宝贵时间。

同样的错误

大家好,我一直在尽我最大的努力自己解决这个问题,但无法掌握它。在@Vadian 的初始回复解决了 IBActions 问题后,我仍然收到相同的 SIGABRT 错误。

错误信息

2016-10-06 17:18:33.709206 Truegram[13130:1026640] [MobileAssetError:29]       Unable to copy asset information from https://mesu.apple.com/assets/ for asset    type com.apple.MobileAsset.TextInput.SpellChecker
sign up pressed
2016-10-06 17:18:53.120 Truegram[13130:1026284] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'The class PFUser must be registered with registerSubclass before using Parse.'

我认为以上内容与错误最相关,这似乎是正确的,因为在按下“注册”后发生错误

我还添加了另一个注册页面,专门针对可能导致问题的企业。

BusinessSignUp.swift

import UIKit
import Parse

class BusinessSignUpVC: UIViewController, UIImagePickerControllerDelegate,   UINavigationControllerDelegate  {

// profile image
@IBOutlet weak var BusinessAvaImg: UIImageView!

// textfields
@IBOutlet weak var confirmTxt: UITextField!
@IBOutlet weak var passwordTxt: UITextField!
@IBOutlet weak var AddressTxt: UITextView!
@IBOutlet weak var contactNumTxt: UITextField!
@IBOutlet weak var emailTxt: UITextField!
@IBOutlet weak var businessNameTxt: UITextField!

// buttons
@IBOutlet weak var loginBtn: UIButton!
@IBOutlet weak var signupBtn: UIButton!

@IBAction func loginBtnClick(_ sender: AnyObject) {
}


// keyboard frame size
var keyboard = CGRect()


override func viewDidLoad() {
    super.viewDidLoad()

    // check notifications if keyboard is shown or not
    NotificationCenter.default.addObserver(self, selector: #selector(BusinessSignUpVC.showKeyboard(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: Selector(("hideKeyboard:")), name: NSNotification.Name.UIKeyboardWillHide, object: nil)

    // declare hide keyboard tap
    let hideTap = UITapGestureRecognizer(target: self, action: #selector(BusinessSignUpVC.hideKeyboardTap(_:)))
    hideTap.numberOfTapsRequired = 1
    self.view.isUserInteractionEnabled = true
    self.view.addGestureRecognizer(hideTap)

    // profile image circle shape and custom border colour
    BusinessAvaImg.layer.borderWidth = 2
    BusinessAvaImg.layer.borderColor = UIColor.init(red: 90/255, green: 187/255, blue: 181/255, alpha: 1).cgColor
    BusinessAvaImg.layer.cornerRadius = BusinessAvaImg.frame.height/2
    BusinessAvaImg.clipsToBounds = true

    // declare select image tap
    let avaTap = UITapGestureRecognizer(target: self, action: #selector(BusinessSignUpVC.loadImg(_:)))
    avaTap.numberOfTapsRequired = 1
    BusinessAvaImg.isUserInteractionEnabled = true
    BusinessAvaImg.addGestureRecognizer(avaTap)
}

// call picker to select image
func loadImg(_ recognizer: UITapGestureRecognizer) {

    let picker = UIImagePickerController()
    picker.delegate = self
    picker.sourceType = .photoLibrary
    picker.allowsEditing = true
    present(picker, animated: true, completion: nil)
}

// connect selected image to our image view
private func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
    BusinessAvaImg.image = info[UIImagePickerControllerEditedImage] as? UIImage
    self.dismiss(animated: true, completion: nil)
}


// hide keyboard if tapped
func hideKeyboardTap(_ recognizer: UITapGestureRecognizer) {
    self.view.endEditing(true)
}

// show keyboard
func showKeyboard(_ notification: NSNotification) {

    // define keyboard sizes
    keyboard = ((notification.userInfo?[UIKeyboardFrameEndUserInfoKey]! as AnyObject).cgRectValue)!
    // Do any additional setup after loading the view.
}

// clicked sign up
@IBAction func signupBtnClick(_ sender: AnyObject) {
    print("sign up pressed")

    // dismiss keyboard
    self.view.endEditing(true)


    // if fields are empty
    if (emailTxt.text!.isEmpty || passwordTxt.text!.isEmpty || confirmTxt.text!.isEmpty || businessNameTxt.text!.isEmpty || AddressTxt.text!.isEmpty || contactNumTxt.text!.isEmpty) {

        // alert pop up message
        let alert = UIAlertController(title: "Please", message: "fill all fields", preferredStyle: UIAlertControllerStyle.alert)
        let ok = UIAlertAction(title: "OK", style: UIAlertActionStyle.cancel, handler: nil)
        alert.addAction(ok)
        self.present(alert, animated: true, completion: nil)

    }

    // if incorrect password
    if passwordTxt.text != confirmTxt.text {

        // alert pop up message
        let alert = UIAlertController(title: "Attention", message: "incorrect password", preferredStyle: UIAlertControllerStyle.alert)
        let ok = UIAlertAction(title: "OK", style: UIAlertActionStyle.cancel, handler: nil)
        alert.addAction(ok)
        self.present(alert, animated: true, completion: nil)

    }

    // send data to related columns in server
    let businessUser = PFUser()
    businessUser.username = businessNameTxt.text?.lowercased()
    businessUser.email = emailTxt.text?.lowercased()
    businessUser.password = passwordTxt.text
    businessUser["BusinessUser"] = businessNameTxt.text?.lowercased()
    businessUser["Address"] = AddressTxt.text?.lowercased()
    businessUser["ContactNumber"] = contactNumTxt.text?.lowercased()

    // convert our image for sending to server
    let avaData = UIImageJPEGRepresentation(BusinessAvaImg.image!, 0.5)
    let avaFile = PFFile(name: "ava.jpg", data: avaData!)
    businessUser["ava"] = avaFile

    // save data in server
    businessUser.signUpInBackground { (success: Bool, error: Error?) -> Void in
        if success {
            print("registered")

            // remember logged user
            UserDefaults.standard.set(businessUser.username, forKey: "username")
            UserDefaults.standard.synchronize()

            // calls login func from AppDelegate.swift class
            let appDelegate : AppDelegate = UIApplication.shared.delegate as! AppDelegate
            appDelegate.login()

        } else {

            // show alert message
            let alert = UIAlertController(title: "Error", message: error!.localizedDescription, preferredStyle: UIAlertControllerStyle.alert)
            let ok = UIAlertAction(title: "OK", style: UIAlertActionStyle.cancel, handler: nil)
            alert.addAction(ok)
            self.present(alert, animated: true, completion: nil)

        }


    }

}

// clicked return to log in
@IBAction func businessLoginBtnClick(_ sender: AnyObject) {
    self.dismiss(animated: true, completion: nil)

    // dismiss keyboard
    self.view.endEditing(true)

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


/*
// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // Get the new view controller using segue.destinationViewController.
    // Pass the selected object to the new view controller.
}
*/

}

现在我花了几天时间尝试修复,所以如果有人可以提供帮助,我将非常感激。

【问题讨论】:

  • 您能帮我们一点忙并指出错误在哪一行吗?编译器指向哪一行?
  • 点击按钮时是否出现错误?
  • 查看 Vadian 的回答。当他得到它时,我正要发布它
  • 谢谢大家,非常感谢您的想法和快速响应。

标签: ios swift runtime-error sigabrt


【解决方案1】:

关键信息是

[Truegram.signUpVC signupBtnClick:]:无法识别的选择器发送到实例 0x7f9d0700cff0'

在 Swift 3 中,IBActions 应该用下划线声明以省略参数标签。

@IBAction func signupBtnClick(_ sender: AnyObject) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    相关资源
    最近更新 更多