【问题标题】:Sending a string from one viewcontroller to another using delegate in swift在 swift 中使用委托将字符串从一个视图控制器发送到另一个视图控制器
【发布时间】:2020-01-31 17:05:40
【问题描述】:

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

运行代码时我没有收到任何错误,但是当我运行应用程序模拟并在 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?) {

    }


}

【问题讨论】:

  • 你设置了代理吗?您可能需要在 ButtonPressPopupMenu 中使用 popOverVC.delegate = self。
  • 我认为 john elemans 可能是对的。您可以通过在ButtonPressSvimmelhed 中设置断点来检查symptomDelegate 是否为nil

标签: swift xcode delegates


【解决方案1】:

如 cmets 中所述,委托未设置。

然而,在 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, ")
    }
    
  • DagbogsindlaegViewControllerButtonPressPopupMenu 添加闭包

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

注意事项:

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

  • 不要在 Swift 中使用 NS... 类,如果有本地对应类,例如 Date

  • 请按照命名约定以小写字母开头命名变量和函数/方法。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多