如何引用子类的父视图控制器?

How do I reference a subclass's parent view controller?

在这里你可以看到我已经将我的 subclassed textView 的委托设置为它自己:

import Foundation
class ImageCaptionTextView: UITextView, UITextViewDelegate {

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

现在在我的控制器中,我的委托方法不起作用。我在 ImageCaptionTextView subclass 中使用了所有 ImageCaptionTextView 委托方法,而不是以前在控制器 class 中使用的方法。

现在我需要将一些代码添加到 ImageCaptionTextView 的控制器相关的 textViewDidEndEditing 委托方法中,但是因为 ImageCaptionTextView 的委托方法是在 ImageCaptionTextView subclass 中添加的这个新代码赢得了没用。

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

所以我的问题是:

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

感谢您的宝贵时间。

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

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

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

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

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

考虑在 subclassing 之前使用委托方法在控制器中尽你所能。如果您遇到委托方法无法处理的问题,subclass,但尽可能少地更改视图 class 实现。

我想这可能对你有帮助..

首先,您需要在 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

那你应该很好 ;)