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

问题描述 投票:0回答:1

[我试图在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?) {

    }


}

swift xcode delegates
1个回答
0
投票

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

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

  • 删除

protocol TextFraPopupDelegate{
    func Symptomer(Svimmelhed: String)
}

  • PopupViewController中替换

    var symptomDelegate: TextFraPopupDelegate?
    

    with

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

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

    with

    @IBAction func ButtonPressSvimmelhed(_ sender: UIButton) {
        sender.isSelected.toggle()  
        callback?("Svimmelhed, ")
    }
    
  • DagbogsindlaegViewController中的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 = { [weak self] 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
    }
}  

注意:

  • 语法(_ success: Bool, _ error: NSError?) -> Void)?已过时。由于Swift 3的参数标签不见了,这就足够了:(Bool, NSError?) -> Void)?

  • [如果有本机副本,例如NS...

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

© www.soinside.com 2019 - 2024. All rights reserved.