Отправка строки из одного viewcontroller в другой с использованием делегата в swift - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь сделать нажатие кнопки в PopupViewController, чтобы заполнить текстовое поле в DagbogsindlaegViewController строкой "svimmelhed".

Я не получаю никаких ошибок при запуске кода, но текст не там, когда я запускаю симуляцию приложения и нажимаю «ButtonPressSvimmelhed» в классе PopupViewController. Есть добрый незнакомец, который может мне помочь и сказать, что я делаю не так?

Код ниже:

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 голосов
/ 31 января 2020

Как уже упоминалось в комментариях, делегат не установлен.

Однако в 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 в 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
    }
}  

Примечания:

  • Синтаксис (_ success: Bool, _ error: NSError?) -> Void)? устарел. Поскольку в Swift 3 метки параметров исчезли, этого достаточно: (Bool, NSError?) -> Void)?

  • Не используйте NS... классы в Swift, если есть собственные аналоги, например Date

  • Пожалуйста, соблюдайте соглашение об именах для именования переменных и функций / методов с начальной строчной буквой.

  • Синтаксис "\(String(describing: TitleTextField.text!))" имеет двойную избыточность. Вы создаете строку из строки из строки. Замените его на TitleTextField.text!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...