根据控制台,代表似乎没有工作
Delegate seems to not be working, according to the console
这里我有两个 classes。如何让 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 我想调用方法的地方。
class JournalEntryController: UIPageViewController, UIPageViewControllerDataSource, JournalPageDelegate {
func didSubmit(for commentText: String) {
print("Testing for text")
}
}
出于某种原因,当我在 JournalPage
class 上点击保存时,我没有在控制台上看到 "Testing"。如何让 JournalPage
调用 JournalEntryController
didSubmit
方法?
您从网页浏览控制器委托:
{your JournalPage controller object}.delegate = self
无论何时使用委托,您都需要将该委托从一个视图控制器传递到另一个视图控制器。
根据 Apple 定义:
委托是一种简单而强大的模式,其中程序中的一个对象代表另一个对象或与另一个对象协作。委托对象保留对另一个对象(委托)的引用,并在适当的时候向它发送消息。该消息通知委托对象即将处理或刚刚处理的事件的委托。委托可以通过更新自身或应用程序中其他对象的外观或状态来响应消息,在某些情况下,它可以 return 一个影响即将发生的事件的处理方式的值。委托的主要价值在于它允许您轻松地在一个中心对象中自定义多个对象的行为。
您正在做的缺失部分是您没有为您在 class JournalEntryController
中调用 JournalTextDelegate
的示例调用委托,因此您需要调用此 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
这里我有两个 classes。如何让 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 我想调用方法的地方。
class JournalEntryController: UIPageViewController, UIPageViewControllerDataSource, JournalPageDelegate {
func didSubmit(for commentText: String) {
print("Testing for text")
}
}
出于某种原因,当我在 JournalPage
class 上点击保存时,我没有在控制台上看到 "Testing"。如何让 JournalPage
调用 JournalEntryController
didSubmit
方法?
您从网页浏览控制器委托:
{your JournalPage controller object}.delegate = self
无论何时使用委托,您都需要将该委托从一个视图控制器传递到另一个视图控制器。 根据 Apple 定义:
委托是一种简单而强大的模式,其中程序中的一个对象代表另一个对象或与另一个对象协作。委托对象保留对另一个对象(委托)的引用,并在适当的时候向它发送消息。该消息通知委托对象即将处理或刚刚处理的事件的委托。委托可以通过更新自身或应用程序中其他对象的外观或状态来响应消息,在某些情况下,它可以 return 一个影响即将发生的事件的处理方式的值。委托的主要价值在于它允许您轻松地在一个中心对象中自定义多个对象的行为。
您正在做的缺失部分是您没有为您在 class JournalEntryController
中调用 JournalTextDelegate
的示例调用委托,因此您需要调用此 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