【问题标题】:How do I reference a subclass's parent view controller?如何引用子类的父视图控制器?
【发布时间】:2015-01-16 16:42:11
【问题描述】:

在这里您可以看到我已将子类 textView 的委托设置为自身:

import Foundation
class ImageCaptionTextView: UITextView, UITextViewDelegate {

    override func awakeFromNib() {
        super.awakeFromNib()
        delegate = self
    }

现在在我的控制器中,我的委托方法不起作用。我在 ImageCaptionTextView 子类中使用所有 ImageCaptionTextView 委托方法,而不是它们以前的控制器类。

现在我需要将一些代码添加到与控制器相关的 textViewDidEndEditing ImageCaptionTextView 委托方法,但由于 ImageCaptionTextView 的委托方法设置在 ImageCaptionTextView 子类中,因此在控制器中添加的新代码将不起作用。

我开始怀疑我是否只是将事情复杂化,是否应该将尽可能多的代码移回控制器。我只是觉得它让我的事情变得更干净了。

所以我的问题是:

我如何引用 ImageCaptionTextView 的父控制器,而不是将 ImageCaptionTextView 的委托设置为自身,我可以将其设置为控制器?

感谢您的宝贵时间。

【问题讨论】:

    标签: objective-c cocoa-touch swift uiviewcontroller delegates


    【解决方案1】:

    您可以实现委托方法,然后将相同的消息发送到控制器,但老实说,这很淘气。

    考虑在子类化之前使用委托方法在控制器中做所有可以做的事情。如果您遇到了委托方法无法处理的问题,请子类化,但要尽可能少地更改视图类实现。

    【讨论】:

    • 最后就是这样。
    【解决方案2】:

    我认为这可能对你有所帮助..

    首先你需要在你的 UITextView 中定义一个委托变量。这是一种可能的设置方式:

    class ImageCaptionTextView: UITextView, UITextViewDelegate {
    
        var delegate: UITextViewDelegate!
    
        override func awakeFromNib() {
            super.awakeFromNib()
            // delegate = self
        }
    }
    

    感叹号表示变量在声明时尚未初始化,但稍后将在代码中初始化。因此它不是可选的,必须在某处初始化。

    然后在您的 UIViewController 中,使用对 UITextView 的引用来初始化该变量。故事板中的出口应该可以解决问题。如果您以编程方式设置了 UIView,那就更容易了。

    IB出口方式:

    @IBOutlet weak var imageCaptionTextView: UITextView!
    
    // later in the code
    
    imageCaptionTextView.delegate = self
    

    以编程方式:

    let imageCaptionTextView = ImageCaptionTextView()
    imageCaptionTextView.delegate = self
    

    那你应该很好;)

    【讨论】:

    • 标记了,因为这有效,但我选择了另一个答案并将所有内容都保存在控制器中。
    【解决方案3】:

    我以前从未使用过 swift,但如果它像 Objective-C 一样工作,那么执行此操作的方法是在创建它的那一刻将 UITextView 子类的委托属性设置为它的父视图控制器。即

    在父 VC 中(如果它在 obj-c 中,请见谅):

    ImageCaptionTextView *myTextView = [ImageCaptionTextView new];
    myTextView.delegate = self;
    

    如果这在 swift 中没有任何意义,那么我将删除此答案。但我希望它会有所帮助!

    【讨论】:

    • 我只是在想这个。初始化 textView 时,不知何故将委托设置为控制器。我尝试在界面构建器中建立从 textView 到控制器的连接。经过测试,它不起作用。
    • 嗯。不确定我可以在那里帮助你,因为我对 IB 也没有那么丰富的经验。一直都是程序化的(应该真的在某个时候分支出来......)。无论如何,如果我是你,我会在你的问题中进行编辑(包括你的 IB 连接的屏幕截图),它会让它回到队列的顶部,也许有 IB/swift 经验的人将能够提供帮助)。
    猜你喜欢
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多