2016-10-04 67 views
-2

我試圖通過點擊一個按鈕來改變在模擬器意見,但不斷收到錯誤:斯威夫特3 - 主題1:信號SIGABRT

Thread 1: signal 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. 
} 



} 

我相信這個問題是一些相當明顯的,但我只用斯威夫特工作了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. 
} 
*/ 

} 

這已經是我花了幾天時間嘗試修復的,所以我會很感激,如果有人可以幫助。

+0

你能幫助我們一點,並指出錯誤是什麼行嗎?編譯器指出什麼? – KSigWyatt

+0

點擊按鈕時會出現錯誤嗎? –

+0

看到Vadian的回答。我正要發佈它,當他得到它 – KSigWyatt

回答

1

關鍵信息是

[Truegram.signUpVC signupBtnClick:]: unrecognized selector sent to instance 0x7f9d0700cff0'

在夫特3 IBAction s的應該以下劃線以省略參數標籤聲明。

@IBAction func signupBtnClick(_ sender: AnyObject) 
+0

非常感謝你! – DBDB91