2015-09-08 1 views
0

У меня проблема, с которой я не мог справиться. Проблема в том, что я программно создал вызов UIPopoverController из FirstViewController, показанный ниже.Как передать данные без использования segues из программно созданного UIPopoverController в ViewController с использованием делегатов и протоколов?

@IBAction func addButton(sender: UIButton) { 

      let popoverRect = CGRectMake(-360.0, 170.0, 515.0, 415.0) 
      var popView = AddCustomerPopoverVC (nibName :"AddCustomerPopoverVC" , bundle : nil) 
      var popController = UIPopoverController (contentViewController: popView) 
      popController.delegate = self 
      popController.popoverContentSize = CGSize(width: 515.0 , height: 415.0) 
      popController.presentPopoverFromRect(popoverRect , inView: self.view , permittedArrowDirections: UIPopoverArrowDirection.allZeros, animated: true) 
} 

И passCustomer делегировать метод defination в FirstViewController;

func passCustomer(customer: Customer) { 

     self.profilePhoto.image = UIImage(named: "circleBlue.png") as UIImage? 
     self.usernameLabel.text = customer.name 
     self.eMailLabel.text = customer.eMail 
} 

И AddCustomerPopoverVC, показанный ниже;

import UIKit 
    import Foundation 

    protocol PassValues { 

     func passCustomer(customer : Customer) 

    } 


    class AddCustomerPopoverVC: UIViewController { 

     var delegate : PassValues? = nil 
     @IBOutlet weak var navBar: UINavigationBar! 
     @IBOutlet weak var nameTextField: UITextField! 
     @IBOutlet weak var surnameTextField: UITextField! 
     @IBOutlet weak var eMailTextField: UITextField! 
     @IBOutlet weak var phoneTextField: UITextField! 
     @IBOutlet weak var advSwitchOutlet: UISwitch! 
     @IBOutlet weak var taxFreeSwitchOutlet: UISwitch! 

     @IBAction func saveButton(sender: UIBarButtonItem) { 

      var cName = "\(self.nameTextField.text) \(self.surnameTextField.text)" 
      var cEmail = self.eMailTextField.text 
      var cPhone = self.phoneTextField.text 
      var cAdDelivery = self.advSwitchOutlet.on ? true : false 
      var cTaxFree = self.taxFreeSwitchOutlet.on ? true : false 

      let customer : Customer = Customer(name: cName, eMail: cEmail, phone: cPhone, adDelivery: cAdDelivery, taxFree: cTaxFree) 

delegate!.passCustomer(customer) 

     } 



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

    } 

Когда я постучал по моей кнопке сохранения, он ничего не делает. Я имею в виду, что это так. но он ничего не делает о процессе передачи значений. Что я должен сделать для завершения этого процесса. Что я делаю неправильно или пропустил?

Я уже проверить ссылку ниже, но я не могу сказать, что у меня есть это ясно .. Trying to understand protocol/delegates in Swift

ответ

1

Я уверен, что вам нужно назначить delegate из popView и не popController:

@IBAction func addButton(sender: UIButton) { 
     let popoverRect = CGRectMake(-360.0, 170.0, 515.0, 415.0) 
     var popView = AddCustomerPopoverVC (nibName :"AddCustomerPopoverVC" , bundle : nil) 
     popView.delegate = self 
     var popController = UIPopoverController (contentViewController: popView) 
     popController.delegate = self 
     popController.popoverContentSize = CGSize(width: 515.0 , height: 415.0) 
     popController.presentPopoverFromRect(popoverRect , inView: self.view , permittedArrowDirections: UIPopoverArrowDirection.allZeros, animated: true) 
} 

Кроме того, это хорошая практика, чтобы назвать дополнительные методы делегатов, как это (уведомление знак вопроса вместо возгласа):

delegate?.passCustomer(customer) 

Так что если делегат - ничто, приложение не будет разбиваться. Если вы полностью уверены, что делегат никогда не будет ник, тогда лучше объявите его var delegate : PassValues!.

+0

Да, это все. Спасибо! – letitbefornow

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