根据控制台,代表似乎无法正常工作

Posted

技术标签:

【中文标题】根据控制台,代表似乎无法正常工作【英文标题】:Delegate seems to not be working, according to the console 【发布时间】:2018-09-14 07:53:52 【问题描述】:

这里我有两节课。如何使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 方法?

【问题讨论】:

您的JournalEntryController 是如何将自己设置为代表的? 在 JournalEntryController 中将委托设置为 self。 我想,你需要在你想调用的类中添加委托 您还需要使委托变弱,并使协议成为类协议。否则会出现内存泄漏。 【参考方案1】:

每当您使用委托时,您都需要将该委托从一个视图控制器传递到另一个视图控制器。 根据苹果定义:

委托是一种简单而强大的模式,其中程序中的一个对象代表另一个对象或与另一个对象协作。委托对象保留对另一个对象(委托)的引用,并在适当的时候向它发送消息。该消息通知委托对象将要处理或刚刚处理的事件的委托。委托可以通过更新其自身或应用程序中其他对象的外观或状态来响应消息,并且在某些情况下,它可以返回一个影响即将发生的事件的处理方式的值。委托的主要价值在于它允许您在一个中心对象中轻松自定义多个对象的行为。

您正在做的缺失部分是您没有调用您在课堂上称为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

【讨论】:

感谢您的回答和链接。我重新启动了我的页面,并根据您的答案和文档制作了一个新页面。我现在使用“.pushViewController”方法(我想我以前有 .present)并且“保存”按钮在被推送的视图控制器上工作。但是,这次我没有使用导航栏的正确项目。我决定删除导航栏,并手动添加了一个按钮。委托技术奏效了。谢谢你的回答!我更了解视图层次结构和导航。【参考方案2】:

您从页面浏览控制器委托:

your JournalPage controller object.delegate = self

【讨论】:

以上是关于根据控制台,代表似乎无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionViewCell 中的自动布局宽度常量无法正常工作

在视图控制器之间传递数据无法正常工作

无法让 onChanged 与 GetX 一起正常工作

AWS Glue 开发终端节点无法正常工作

UIButton.addTarget 无法正常工作。似乎是一个时间问题?

无法将附件传递给控制器​​:422 Unprocessable Entity