2015-09-30 6 views
0

Я искал и искал, но не нашел решение. Регистрация работает, но не будет переходить к следующему контроллеру представления. Heres мой код:Segue to next view controller после успешной регистрации

import UIKit 
import Parse 
import Bolts 

class SignUpVC: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 

@IBOutlet weak var profilePictureIV: UIImageView! 
@IBOutlet weak var firstNameTF: UITextField! 
@IBOutlet weak var lastNameTF: UITextField! 
@IBOutlet weak var newUsernameTF: UITextField! 
@IBOutlet weak var newPasswordTF: UITextField! 
@IBOutlet weak var emailTF: UITextField! 
@IBOutlet weak var phoneNumberTF: UITextField! 

@IBAction func setProfilePicture(sender: AnyObject) { 
    let myPickerController = UIImagePickerController() 
    myPickerController.delegate = self 
    myPickerController.sourceType = UIImagePickerControllerSourceType.PhotoLibrary 
    self.presentViewController(myPickerController, animated: true, completion: nil) 
} 

@IBAction func signUpButton(sender: AnyObject) { 
    let spinner: UIActivityIndicatorView = UIActivityIndicatorView(frame: CGRectMake(0, 0, 150, 150)) as UIActivityIndicatorView 

    if firstNameTF.text != "" && lastNameTF.text != "" && newUsernameTF.text != "" && newPasswordTF.text != "" && emailTF.text != "" && phoneNumberTF.text != "" { 

     let newUser = PFUser() 

     if let profilePictureImage = profilePictureIV?.image { 
      let profilePicture = UIImageJPEGRepresentation(profilePictureImage, 1)! 
      let profilePictureImageFile = PFFile(data: profilePicture) 
      newUser["profilePicture"] = profilePictureImageFile 
     } 
     newUser["firstName"] = firstNameTF.text 
     newUser["lastName"] = lastNameTF.text 
     newUser.username = newUsernameTF.text 
     newUser.password = newPasswordTF.text 
     newUser.email = emailTF.text 
     newUser["phoneNumber"] = phoneNumberTF.text 

     newUser.signUpInBackgroundWithBlock { 
      (succeeded: Bool, error: NSError?) -> Void in 
      if let error = error { 
       spinner.startAnimating() 
       self.alert("Opps", textMessage: (error.localizedDescription)) 
      } else { 
       spinner.startAnimating() 
       self.alert("Congratualtion!", textMessage: "Success, your account has been created.") 
       self.performSegueWithIdentifier("showMessages", sender: self) 
      } 
     } 
    } else { 
     alert("Hmm...", textMessage: "If you want an account, please fill in the blanks.") 
    } 
} 

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. 
} 

override func viewWillAppear(animated: Bool) { 
    self.navigationController!.navigationBar.hidden = false 
} 

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 
    profilePictureIV.image = info[UIImagePickerControllerOriginalImage] as? UIImage 
    self.dismissViewControllerAnimated(true, completion: nil) 
} 

func alert(textTitle: String, textMessage: String) { 
    let alertController = UIAlertController(title: textTitle, message: textMessage, preferredStyle: .Alert) 
    alertController.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil)) 
    self.presentViewController(alertController, animated: true, completion: nil) 
} 


/* 
// MARK: - Navigation 

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

} 

Если я играть self.performSegueWithIdentifier("showMessages", sender: self) линию где-нибудь еще, то, когда я запустить программу и нажать на кнопку Регистрация будет непосредственно перейти в сообщения просмотра контроллера без аккаунта требовалось.

+0

Вы не должны выдавать модальное предупреждение, прежде чем пытаться 'performSegueWithIdentifier' к следующему экрану. Удалите это и посмотрите, что произойдет, иначе опишите, что произойдет, когда вы зарегистрируетесь. – Paulw11

+0

Как @ Paulw11 удаляет предупреждение, а затем выполняет segue, если вы все еще хотите получить предупреждение перед тем, как показывать следующий VC, добавьте обработчик завершения или блок обработчика блокировки к кнопке увольнения из Alert, чтобы вы могли выполнить segue в этом блоке , – iamyogish

+0

Ах, спасибо @ Paulw11 и @iamyogish! Я просто переключил две линии, и это сработало отлично! –

ответ

0

как сказал Paulw11, попробуйте удалить предупреждающее сообщение: -

 if let error = error { 
      spinner.startAnimating() 
      self.alert("Opps", textMessage: (error.localizedDescription)) 
     } else { 
      spinner.startAnimating() 
      self.performSegueWithIdentifier("showMessages", sender: self) 

      } 

или Вы можете вызвать обработчик в коде.

  if let error = error { 
      spinner.startAnimating() 
      self.alert("Opps", textMessage: (error.localizedDescription)) 
     } else { 
      spinner.startAnimating() 
      var alert = UIAlertController(title: "Welcome", message: "Login", preferredStyle: UIAlertControllerStyle.Alert) 
      alert.addAction(UIAlertAction(title:"OK", style: .Default, handler: { action in self.performSegueWithIdentifier("showMessages", sender: self) } 

      } 
+0

Это ошибка, я не могу использовать метод 'addAction (...)' на 'alert' –

+0

Отредактирован ответ. Как теперь работает? –

+0

Да, я только что переключил обе линии, так что предупреждение появляется после segue, оно отлично работает! @Chathuranga Silva –

-1

Вы не можете передать себя в качестве аргумента в боковой части блока.

так создать метод называть SEGUE

@IBAction func signUpButton(sender: AnyObject) { 
    let spinner: UIActivityIndicatorView = UIActivityIndicatorView(frame: CGRectMake(0, 0, 150, 150)) as UIActivityIndicatorView 

if firstNameTF.text != "" && lastNameTF.text != "" && newUsernameTF.text != "" && newPasswordTF.text != "" && emailTF.text != "" && phoneNumberTF.text != "" { 

    let newUser = PFUser() 

    if let profilePictureImage = profilePictureIV?.image { 
     let profilePicture = UIImageJPEGRepresentation(profilePictureImage, 1)! 
     let profilePictureImageFile = PFFile(data: profilePicture) 
     newUser["profilePicture"] = profilePictureImageFile 
    } 
    newUser["firstName"] = firstNameTF.text 
    newUser["lastName"] = lastNameTF.text 
    newUser.username = newUsernameTF.text 
    newUser.password = newPasswordTF.text 
    newUser.email = emailTF.text 
    newUser["phoneNumber"] = phoneNumberTF.text 

    newUser.signUpInBackgroundWithBlock { 
     (succeeded: Bool, error: NSError?) -> Void in 
     if let error = error { 
      spinner.startAnimating() 
      self.alert("Opps", textMessage: (error.localizedDescription)) 
     } else { 
      spinner.startAnimating() 
      self.alert("Congratualtion!", textMessage: "Success, your account has been created.") 
      callSegue() 
     } 
    } 
} else { 
    alert("Hmm...", textMessage: "If you want an account, please fill in the blanks.") 
} 
} 

func callSegue() 
{ 
    self.performSegueWithIdentifier("showMessages", sender: self) 
} 
+1

Конечно, вы можете. Если вы используете self в блоке и передаете блок объекту, который сохраняет его, а 'self' сохраняет этот объект, тогда вы получите цикл удержания, но это не будет иметь место здесь. Вызов 'performSegueWithIdentifer' напрямую или в другой функции не делает разницы – Paulw11

+0

, если вы передаете себя, чем получите эту ошибку компиляции (неявное использование« self »в закрытии, используйте« self. », Чтобы сделать семантику захвата явным) –

+0

Какая ошибка компиляции? 'sender' имеет тип' id', поэтому он обязательно примет подкласс 'UIViewController', который будет таким,' '' 'будет в этом случае. – Paulw11

Смежные вопросы