Судя по всему, делегат не работает - PullRequest
0 голосов
/ 14 сентября 2018

Здесь у меня есть два класса.Как мне сделать JournalPage вызов JournalEntryController didSubmit метод.

protocol JournalPageDelegate {
     func didSubmit(for commentText: String)
}

class JournalPage: UIViewController, UITextViewDelegate {

    var delegate: JournalPageDelegate?

    fileprivate let textView: UITextView = {
        let textView = UITextView()

        let attributedText = NSMutableAttributedString(string: "Enter Text Here.", attributes: [NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: 18)])

        textView.textColor = UIColor.black
        textView.backgroundColor = UIColor.white
        textView.becomeFirstResponder()
        textView.selectedTextRange = textView.textRange(from: textView.beginningOfDocument, to: textView.beginningOfDocument)
        textView.attributedText = attributedText
        return textView
}()

    override func viewDidLoad() {
        super.viewDidLoad()

        self.navigationItem.rightBarButtonItem =  UIBarButtonItem(title: "Save", style: .plain, target: self, action: #selector(save))
    }

    @objc func save() {
        print("saving")
        guard let commentText = textView.text else { return }

        delegate?.didSubmit(for: commentText)
    }

А вот класс, в котором я хочу вызвать метод.

class JournalEntryController: UIPageViewController, UIPageViewControllerDataSource, JournalPageDelegate  {

    func didSubmit(for commentText: String) {
        print("Testing for text")
    }
}

И по какой-то причине я не вижу «Тестирование» на консоли при нажатиисэкономить на JournalPage классе.Как мне сделать JournalPage вызов JournalEntryController didSubmit метод?

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Когда бы вы ни использовали делегатов, вам нужно передать этот делегат от одного контроллера представления другому контроллеру представления. Согласно определению Apple:

Делегирование - это простой и мощный шаблон, в котором один объект в программе действует от имени или в координации с другим объектом. Делегирующий объект сохраняет ссылку на другой объект - делегат - и в соответствующее время отправляет ему сообщение. Сообщение информирует делегата о событии, которое делегируемый объект собирается обработать или только что обработал. Делегат может ответить на сообщение, обновив его внешний вид или состояние или другие объекты в приложении, и в некоторых случаях он может возвращать значение, которое влияет на обработку предстоящего события. Основная ценность делегирования заключается в том, что он позволяет легко настраивать поведение нескольких объектов в одном центральном объекте.

Недостающая часть, которую вы делаете, заключается в том, что вы не вызываете делегата для примера, который вы назвали JournalTextDelegate в своем классе JournalEntryController, поэтому вам нужно вызвать этот JournalTextDelegate для JournalPage.

например: Предположим, вы переходите к другому контроллеру представления методом push

let vc = self.storyboard?.instantiateViewController(withIdentifier: “identifierier”) as! JournalPage
 vc.delegate = self // you need to call this delegate
 self.navigationController?.pushViewController(notifDetailVCObj, animated: true)

И это будет работать нормально. Для справки см. Документацию https://developer.apple.com/library/archive/documentation/General/Conceptual/CocoaEncyclopedia/DelegatesandDataSources/DelegatesandDataSources.html

0 голосов
/ 14 сентября 2018

Вы делегируете из контроллера просмотра страниц:

{your JournalPage controller object}.delegate = self
...