快速使用委托从一个视图控制器向另一个视图控制器发送字符串

时间:2020-01-31 17:05:40

标签: swift xcode delegates

我试图在PopupViewController中单击一个按钮,在DagbogsindlaegViewController中的文本字段中填充字符串“ svimmelhed”。

运行代码时没有出现任何错误,但是当我运行应用程序仿真并在类PopupViewController中按“ ButtonPressSvimmelhed”时,文本不存在。 有没有一个陌生人可以帮助我,告诉我我做错了什么?

下面的代码:

import UIKit
import EventKit
class DagbogsindlaegViewController: UIViewController{

    @IBAction func BackToSVC(_ sender: Any){
        self.performSegue(withIdentifier: "BackToSVCSegue", sender: self)
    }

    @IBAction func ToCalenderButtonPress(_ sender: Any) {
        self.performSegue(withIdentifier: "ToCalenderSegue", sender: self)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        TitleTextField.delegate = self
        DescriptionTextField.delegate = self


        // Do any additional setup after loading the view.
    }

    @IBOutlet weak var TitleTextField: UITextField!
    @IBOutlet weak var DescriptionTextField: UITextField!

    func addEventToCalendar(title: String, description: String?, startDate: Date, endDate: Date, completion: ((_ success: Bool, _ error: NSError?) -> Void)? = nil) {
        let eventStore = EKEventStore()

        eventStore.requestAccess(to: .event, completion: { (granted, error) in
            if (granted) && (error == nil) {
                let event = EKEvent(eventStore: eventStore)
                event.title = title
                event.startDate = startDate
                event.endDate = endDate
                event.notes = description
                event.calendar = eventStore.defaultCalendarForNewEvents
                do {
                    try eventStore.save(event, span: .thisEvent)
                } catch let e as NSError {
                    completion?(false, e)
                    return
                }
                completion?(true, nil)
            } else {
                completion?(false, error as NSError?)
            }
        })
    }

    @IBAction func ButtonPressGemDagbog(_ sender: Any) {
        addEventToCalendar(title: "\(String(describing: TitleTextField.text!))", description: "\(String(describing: DescriptionTextField.text!))", startDate: NSDate() as Date, endDate: NSDate() as Date)
    }

    @IBAction func ButtonPressPopupMenu(_ sender: Any) {
        let popOverVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "PopupViewControllerID") as! PopupViewController
        self.addChild(popOverVC)
        popOverVC.view.frame = self.view.frame
        self.view.addSubview(popOverVC.view)
        popOverVC.didMove(toParent: self)
    }

}

extension DagbogsindlaegViewController : UITextFieldDelegate {
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }
}

extension DagbogsindlaegViewController : TextFraPopupDelegate {
    func Symptomer(Svimmelhed: String) {
        TitleTextField.text = Svimmelhed
    }
}

另一个视图控制器:

import UIKit

protocol TextFraPopupDelegate{
    func Symptomer(Svimmelhed: String)
}

class PopupViewController: UIViewController {

    var symptomDelegate: TextFraPopupDelegate?

    override func viewDidLoad() {
        super.viewDidLoad()

        self.showAnimate()
        self.view.backgroundColor = UIColor.black.withAlphaComponent(0.8)
        // Do any additional setup after loading the view.
    }

    @IBAction func ButtonPressBackToDagbogsindlaeg(_ sender: Any) {
        self.removeAnimate()

        //self.view.removeFromSuperview()
    }
    func showAnimate()
    {
        self.view.transform = CGAffineTransform(scaleX: 1.3, y: 1.3)
        self.view.alpha = 0.0;
        UIView.animate(withDuration: 0.25, animations: {
            self.view.alpha = 1.0
            self.view.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
        });
    }

    func removeAnimate()
    {
        UIView.animate(withDuration: 0.25, animations: {
            self.view.transform = CGAffineTransform(scaleX: 1.3, y: 1.3)
            self.view.alpha = 0.0;
            }, completion:{(finished : Bool)  in
                if (finished)
                {
                    self.view.removeFromSuperview()
                }
        });
    }

    @IBAction func ButtonPressSvimmelhed(_ sender: UIButton) {
         if sender.isSelected {
            sender.isSelected = false
        } else {
            sender.isSelected = true
        }
        symptomDelegate?.Symptomer(Svimmelhed: "Svimmelhed, ")


    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    }


}

1 个答案:

答案 0 :(得分:0)

如评论中所述,未设置代理人。

但是,在Swift中,有一种更方便的方法将字符串传递回呈现的视图控制器,即回调闭包。您摆脱了协议和设置委托的责任

  • 删除

protocol TextFraPopupDelegate{
    func Symptomer(Svimmelhed: String)
}

  • PopupViewController中替换

    var symptomDelegate: TextFraPopupDelegate?
    

    使用

    var callback : ((String) -> Void)?
    

    @IBAction func ButtonPressSvimmelhed(_ sender: UIButton) {
         if sender.isSelected {
            sender.isSelected = false
        } else {
            sender.isSelected = true
        }
        symptomDelegate?.Symptomer(Svimmelhed: "Svimmelhed, ")
    }
    

    使用

    @IBAction func ButtonPressSvimmelhed(_ sender: UIButton) {
        sender.isSelected.toggle()  
        callback?("Svimmelhed, ")
    }
    
  • DagbogsindlaegViewController的{​​{1}}中添加闭包

    ButtonPressPopupMenu
  • 最后删除

@IBAction func ButtonPressPopupMenu(_ sender: Any) {
    let popOverVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "PopupViewControllerID") as! PopupViewController
    self.addChild(popOverVC)
    popOverVC.view.frame = self.view.frame
    popOverVC.callback = { string in
       self.TitleTextField.text = string
    }
    self.view.addSubview(popOverVC.view)
    popOverVC.didMove(toParent: self)
}

注意:

  • 语法 extension DagbogsindlaegViewController : TextFraPopupDelegate { func Symptomer(Svimmelhed: String) { TitleTextField.text = Svimmelhed } } 已过时。由于Swift 3的参数标签不见了,这就足够了:(_ success: Bool, _ error: NSError?) -> Void)?

  • 如果有本机副本,例如(Bool, NSError?) -> Void)?

  • ,请不要在Swift中使用NS...
  • 请遵循命名约定,以小写字母开头的变量和函数/方法。

  • 语法Date是双重冗余的。您从一个字符串中的一个字符串创建一个字符串。将其替换为"\(String(describing: TitleTextField.text!))"