Swift 3 - Thread 1: Signal SIGABRT - ios

I am attempting to change views in the simulator via a button click but keep getting the error:
Thread 1: signal SIGABRT
I am aware that this usually occurs when there is a disconnect with outlets or actions but I have checked and they all seem to be linked.
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.
}
}
I am sure the issue is something fairly obvious but I have only been working with Swift for 3 months and it is my first programming language. I would really appreciate the help.
Thanks for your time.
SAME ERROR
Hey guys, I've been trying my best to sort this myself but cannot get to grips with it. After the initial response from #Vadian solved the issue of the IBActions, I have still been receiving the same SIGABRT error.
Error Info
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.'
I think the above is most relevant to the error and this seems to be vindicated as the error occurs after pressing 'sign up'
I have also added another sign up page, specific to businesses that might be causing the issue.
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.
}
*/
}
This has now taken me a couple of days attempting to fix, so I would be very appreciative if anyone could help.

The crucial information is
[Truegram.signUpVC signupBtnClick:]: unrecognized selector sent to instance 0x7f9d0700cff0'
In Swift 3 IBActions are supposed to be declared with an underscore to omit the parameter label.
#IBAction func signupBtnClick(_ sender: AnyObject)

Related

Is there a way for the output text from a pop-up text field to re-write a label on Swift

I'm working on a project titled "apple pie" and I'm trying to figure out if there is a way for a user to enter their name on a pop-up alert, I coded, and for that name, that they typed, to appear or re-write a blue background label on the game.
This is all the code I have so far:
import UIKit
class ViewController: UIViewController {
#IBOutlet var treeImageView: UIImageView!
#IBOutlet var correctWordLabel: UILabel!
#IBOutlet var scoreLabel: UILabel!
#IBOutlet var letterButtons: [UIButton]!
//Player name output to blue label
#IBOutlet weak var textfield: UILabel!
//Click to enter player name
#IBAction func enterButton(_ sender: Any) {
// textfield.text = textbox.text
showNamePopup()
}
var listOfWords = ["mistery", "stars", "banana", "igloo", "bug", "programming", "car", "motorcycle", "weasel", "cat", "bazzinga"]
let incorrectMovesAllowed = 7
var totalWins = 0 {
didSet {
newRound()
}
}
var totalLosses = 0 {
didSet {
newRound()
}
}
var currentGame: Game!
override func viewDidLoad() {
super.viewDidLoad()
newRound()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func newRound() {
if !listOfWords.isEmpty {
let newWord = listOfWords.removeFirst()
currentGame = Game(word: newWord, incorrectMovesRemaining: incorrectMovesAllowed, guessedLetters: [])
enableLetterButtons(true)
updateUI()
} else {
enableLetterButtons(false)
}
}
func enableLetterButtons(_ enable: Bool) {
for button in letterButtons {
button.isEnabled = enable
}
}
func updateUI() {
var letters = [String]()
for letter in currentGame.formattedWord {
letters.append(String(letter))
}
let wordWithSpacing = letters.joined(separator: " ")
correctWordLabel.text = wordWithSpacing
scoreLabel.text = "Wins: \(totalWins), Losses: \(totalLosses)"
treeImageView.image = UIImage(named: "Tree \(currentGame.incorrectMovesRemaining)")
}
#IBAction func letterButtonPressed(_ sender: UIButton) {
sender.isEnabled = false
let letterString = sender.title(for: .normal)!
let letter = Character(letterString.lowercased())
currentGame.playerGuessed(letter: letter)
updateGameState()
}
func updateGameState() {
if currentGame.incorrectMovesRemaining == 0 {
totalLosses += 1
} else if currentGame.word == currentGame.formattedWord {
totalWins += 1
} else {
updateUI()
}
}
/// Pop-Up Coding
private func showNamePopup(){
// Make a confirmation alert dialog.
let alert = UIAlertController(
title: "Enter Name",
message: "Enter player name if you wish to save progess",
preferredStyle: .alert
)
// Add a text field to get user name.
alert.addTextField { textField in _ = textField.text}
// Add cancel action.
alert.addAction(UIAlertAction(title: "Cancel",style: .destructive, handler: { _ in} ))
// Handle state if user cancels the pop-up.
// Add ok action.
alert.addAction(UIAlertAction(title: "Ok",style: .default))
// Show pop-up. Add a completion when pop-up is destroyed.
self.present(alert, animated: true, completion: nil );
}
}
A pop-up of user input:
Apple pie game:
You need to add a completion handler to the 'OK' action in your alert.
private func showNamePopup(){
// Make a confirmation alert dialog.
let alert = UIAlertController(
title: "Enter Name",
message: "Enter player name if you wish to save progess",
preferredStyle: .alert
)
// Add a text field to get user name.
alert.addTextField { textField in _ = textField.text}
// Add cancel action.
alert.addAction(UIAlertAction(title: "Cancel",style: .destructive, handler: { _ in} ))
// Handle state if user cancels the pop-up.
// Add ok action.
let okAction = UIAlertAction(title: "OK", style: .default) { [weak self] _ in
if let name = alert.textFields?.first?.text {
self?.nameLabel.text = name // Show the name in the text label
}
}
alert.addAction(okAction)
// Show pop-up. Add a completion when pop-up is destroyed.
self.present(alert, animated: true, completion: nil );
}

Use of unresolved identifier 'displayAlertMessage'

I tried the moved the code around a bit. The errors I got was use of local variable displayMessage before its declaration. So I moved the func displayAlertMessage above the display an alert Message comment, the new error is use of unresolved identifier 'displayAlertMessage'
//
// RegisterPageViewController.swift
// UserLoginandRegistration
//
// Created by Iyah Chulo on 17/11/2017.
// Copyright © 2017 Iyah Chulo. All rights reserved.
//
import UIKit
class RegisterPageViewController: UIViewController {
#IBOutlet weak var userEmailTextField: UITextField!
#IBOutlet weak var userPasswordTextField: UITextField!
#IBOutlet weak var ReenterPasswordTextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
#IBAction func RegisterButtonTapped(_ sender: Any) {
let userEmail = userEmailTextField.text;
let userPassword = userPasswordTextField.text;
let userReenterPassword = ReenterPasswordTextField.text;
// Check for empty fields
if((userEmail?.isEmpty)! || (userPassword?.isEmpty)! ||
(userReenterPassword?.isEmpty)!)
{
func displayAlertMessage(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.present(myAlert, animated: true,
completion:nil)
}
//Display alert message
displayAlertMessage(userMessage: "All fields are required")
return;
}
//Check if passwords match
if(userPassword != userReenterPassword)
{
// Display an alert message
displayAlertMessage(userMessage: "Passwords do not match")
return;
}
// Store data
UserDefaults.standard.set(userEmail, forKey:"userEmail")
UserDefaults.standard.set(userEmail, forKey:"userPassword")
UserDefaults.standard.synchronize()
// Display alert message with confirmation
var myAlert = UIAlertController(title:"Alert", message: "Registration is successful.Thank you!", preferredStyle:
UIAlertControllerStyle.alert);
let okAction = UIAlertAction(title:"Ok", style:
UIAlertActionStyle.default) { action in
self.dismiss(animated: true, completion:nil)
}
}
}
Your displayAlertMessage function definition needs to be outside of the other functions in your class.
Also, please note that Swift does not require semicolons!
Try this:
import UIKit
class RegisterPageViewController: UIViewController {
#IBOutlet weak var userEmailTextField: UITextField!
#IBOutlet weak var userPasswordTextField: UITextField!
#IBOutlet weak var ReenterPasswordTextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
#IBAction func RegisterButtonTapped(_ sender: Any) {
let userEmail = userEmailTextField.text
let userPassword = userPasswordTextField.text
let userReenterPassword = ReenterPasswordTextField.text
// Check for empty fields
if((userEmail?.isEmpty)! || (userPassword?.isEmpty)! ||
(userReenterPassword?.isEmpty)!)
{
//Display alert message
displayAlertMessage(userMessage: "All fields are required")
return;
}
//Check if passwords match
if(userPassword != userReenterPassword)
{
// Display an alert message
displayAlertMessage(userMessage: "Passwords do not match")
return;
}
// Store data
UserDefaults.standard.set(userEmail, forKey:"userEmail")
UserDefaults.standard.set(userEmail, forKey:"userPassword")
UserDefaults.standard.synchronize()
// Display an alert message
displayAlertMessage(userMessage: "Registration is successful.Thank you!")
}
func displayAlertMessage(userMessage: String) {
let myAlert = UIAlertController(title:"Alert", message: userMessage, preferredStyle: UIAlertControllerStyle.alert)
let okAction = UIAlertAction(title:"Ok", style: UIAlertActionStyle.default) {
action in
self.dismiss(animated: true, completion:nil)
}
myAlert.addAction(okAction);
self.present(myAlert, animated: true, completion: nil)
}
}

Why is my string becoming nil when used as the title of an action sheet?

In an app I am currently writing, I have a string named 'User' which stores the user's name for a game. The value of the string, when printed anywhere else in the Swift file, prints the value that I have set, as an optional.
If I try to use this string as the title of an action sheet action, the string is automatically set to nil, which I can see as both the title of the action and which is printed when I ask it to print(user).
If anyone could shed some light as to why this is happening, or how to prevent it, that would be great. I have also posted my Swift file below, thanks.
import UIKit
class MainViewController: UIViewController {
#IBOutlet weak var segmentedControl: UISegmentedControl!
#IBOutlet weak var firstView: UIView!
#IBOutlet weak var secondView: UIView!
var user:String!
var playerTwo:String!
var playerThree:String!
var playerFour:String!
var playerFive:String!
var playerSix:String!
var userCards = [String]()
override func viewDidLoad() {
super.viewDidLoad()
firstView?.isHidden = false
secondView?.isHidden = true
}
#IBAction func valueDidChange(_ sender: UISegmentedControl) {
switch segmentedControl.selectedSegmentIndex {
case 0:
firstView.isHidden = false
secondView.isHidden = true
case 1:
firstView.isHidden = true
secondView.isHidden = false
default:
break;
}
}
#IBAction func confirm(_ sender: UIButton) {
let alertController = UIAlertController(title: "Action Sheet", message: "What would you like to do?", preferredStyle: .actionSheet)
let userButton = UIAlertAction(title: user /* Here I have tried with putting both 'user', and "\(user)"*/, style: .default, handler: { (action) -> Void in
print("User button tapped")
})
let deleteButton = UIAlertAction(title: "Delete button test", style: .destructive, handler: { (action) -> Void in
print("Delete button tapped")
})
let cancelButton = UIAlertAction(title: "Cancel", style: .cancel, handler: { (action) -> Void in
print("Cancel button tapped")
})
alertController.addAction(userButton)
alertController.addAction(deleteButton)
alertController.addAction(cancelButton)
self.present(alertController, animated: true, completion: nil)
}
}
The value is passed into the above file directly from this code in another file:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showMainController" {
let VC = segue.destination as! MainViewController
VC.user = self.user
if playerTwo != nil {
VC.playerTwo = self.playerTwo
}
if playerThree != nil {
VC.playerThree = self.playerThree
}
if playerFour != nil {
VC.playerFour = self.playerFour
}
if playerFive != nil {
VC.playerFive = self.playerFive
}
if playerSix != nil {
VC.playerSix = self.playerSix
}
}
}
The value is, however, passed through several view controllers, and is initially set here:
if (meTextField.text?.isEmpty)! == false {
let p1 = meTextField.text!
initialPlayersDict["player1"] = "\(p1)"
if errLabelNotBlank {
errorLabel.text = ""
errLabelNotBlank = false
}
}

Swift error: "MailCompositionService quit unexpectedly"

The error message screenshot:
When I click the "click here" button in the paragraph that says "If you forgot your username/password, click here to send a verification message that contains your username/password to your email address", the dialogue box pops up and says "MailCompositionService quit unexpectedly", and that message is the error I want to solve.
This class below this sentence is the Swift code for the page that has the "click here" button which generates the error I want to solve. It is the ViewController class.
import UIKit
import MessageUI
class ViewController: UIViewController, MFMailComposeViewControllerDelegate
{
#IBOutlet weak var ClickHereSendEmailButton: UIButton!
#IBOutlet weak var Label: UILabel!
#IBOutlet weak var UsernameTextField: UITextField!
#IBOutlet weak var PasswordTextField: UITextField!
#IBOutlet weak var SignInButton: UIButton!
#IBAction func PressedSignInButton(sender: UIButton)
{
if UsernameTextField.text == username && PasswordTextField.text == password
{
// create the alert
let alert = UIAlertController(title: "Correct", message: "Your credentials are correct.", preferredStyle: UIAlertControllerStyle.Alert)
// add an action (button)
alert.addAction(UIAlertAction(title: "Okay", style: UIAlertActionStyle.Default, handler: nil))
// show the alert
self.presentViewController(alert, animated: true, completion: nil)
Label.text = "The credentials are correct."
UsernameTextField.resignFirstResponder()
PasswordTextField.resignFirstResponder()
}
else
{
// create the alert
let alert = UIAlertController(title: "Incorrect", message: "Your credentials are incorrect.", preferredStyle: UIAlertControllerStyle.Alert)
// add an action (button)
alert.addAction(UIAlertAction(title: "Okay", style: UIAlertActionStyle.Default, handler: nil))
// show the alert
self.presentViewController(alert, animated: true, completion: nil)
Label.text = "The credentials are not correct."
UsernameTextField.resignFirstResponder()
PasswordTextField.resignFirstResponder()
}
}
#IBAction func PressedClickHereSendEmailButton(sender: UIButton)
{
let mailComposeViewController = configuredMailComposeViewController()
if MFMailComposeViewController.canSendMail() {
self.presentViewController(mailComposeViewController, animated: true, completion: nil)
} else {
self.showSendMailErrorAlert()
}
}
func configuredMailComposeViewController() -> MFMailComposeViewController {
let mailComposerVC = MFMailComposeViewController()
mailComposerVC.mailComposeDelegate = self // Extremely important to set the --mailComposeDelegate-- property, NOT the --delegate-- property
mailComposerVC.setToRecipients(["nurdin#gmail.com"])
mailComposerVC.setSubject("Sending you an in-app e-mail...")
mailComposerVC.setMessageBody("Sending e-mail in-app is not so bad!", isHTML: false)
return mailComposerVC
}
func showSendMailErrorAlert() {
let sendMailErrorAlert = UIAlertView(title: "Could Not Send Email", message: "Your device could not send e-mail. Please check e-mail configuration and try again.", delegate: self, cancelButtonTitle: "OK")
sendMailErrorAlert.show()
}
// MARK: MFMailComposeViewControllerDelegate
func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) {
controller.dismissViewControllerAnimated(true, completion: nil)
}
}
Here is the AppDelegate class
import UIKit
#UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate
{
var window: UIWindow?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
return true
}
}
Create account page:
import UIKit
var username = ""
var password = ""
var email = ""
class CreateAccountPage: UIViewController
{
#IBOutlet weak var UserNameTextField: UITextField!
#IBOutlet weak var PasswordTextField: UITextField!
#IBOutlet weak var EmailAddressTextField: UITextField!
#IBOutlet weak var ActivateButton: UIButton!
#IBOutlet weak var ReturnButton: UIButton!
#IBAction func PressedActivateButton(sender: UIButton)
{
username = UserNameTextField.text!
password = PasswordTextField.text!
email = EmailAddressTextField.text!
// create the alert
let alert = UIAlertController(title: "Activated", message: "Your new account is now activated.", preferredStyle: UIAlertControllerStyle.Alert)
// add an action (button)
alert.addAction(UIAlertAction(title: "Okay", style: UIAlertActionStyle.Default, handler: nil))
// show the alert
self.presentViewController(alert, animated: true, completion: nil)
}
#IBAction func ReturnButton(sender: UIButton)
{
}
//performSegueWithIdentifier("mySegueID", sender: nil
}
EDIT: I also included two screenshots so please view them to make it clear.
EDIT #2: I would post more screenshots of the storyboard links but I can only post two, so let me know and I'll email them.
The MailCompositionService quit unexpectedly error is a simulator bug. Run your mail sending code on a real device to test it.
This is simulator problem not your problem , Try to connect your iPhone using usb and select it from Xcode then run the application , it should work without error , if there is an errors let us know

UIAlert does not working with NSNotification

I put Reachability.swift file in my app, when Internet reachability is changed, I want to alert to user that internet connection is not available.
this is my code.
import UIKit
import Parse
class ViewController: UIViewController {
var reachability : Reachability?
var myAlert = UIAlertController()
#IBOutlet weak var label: UILabel!
#IBOutlet weak var textField: UITextField!
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(true)
do {
let reachability = try Reachability.reachabilityForInternetConnection()
self.reachability = reachability
} catch ReachabilityError.FailedToCreateWithAddress(let address) {
}
catch {}
NSNotificationCenter.defaultCenter().addObserver(self, selector: "HeyUserInternetDoesntWork", name: ReachabilityChangedNotification, object: nil)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
#IBAction func saveButtonTapped(sender: AnyObject) {
let save = PFObject(className: "Practice")
save["text"] = textField.text
save.saveInBackgroundWithBlock { (success: Bool, error: NSError?) -> Void in
print("Object has been saved.")
}
}
dynamic func HeyUserInternetDoesntWork() {
if reachability!.isReachable() {
} else {
myAlert = UIAlertController(title: "No internet", message: "no good", preferredStyle: UIAlertControllerStyle.Alert)
let okAction = UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: nil)
myAlert.addAction(okAction) }
}
}
this is not working, I got an error that
Attempting to load the view of a view controller while it is deallocating is not allowed and may result in undefined behaviour
I don't understand what this mean.
If I put code that print("unreachable") will work fine.
My question
what is meaning of that error?
How I can make my alert works?
If there is other way to let user know Internet connectivity,
please let me know.
try to add this line under alert
(self.presentViewController(myAlert, animated: true, completion: nil))

Resources