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

时间:2015-01-16 16:42:11

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

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

import Foundation
class ImageCaptionTextView: UITextView, UITextViewDelegate {

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

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

现在有一些代码需要添加到ImageCaptionTextView的控制器相关的textViewDidEndEditing委托方法,但是因为ImageCaptionTextView的委托方法是在ImageCaptionTextView子类中设置的,所以在控制器中添加的新代码将不起作用。

我开始怀疑我是否只是复杂的东西,应该尽可能多地移动代码到我可以回到控制器中。我只是觉得它让事情变得更清洁了。

所以我的问题是:

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

感谢您的时间。

3 个答案:

答案 0 :(得分:1)

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

考虑在子类化之前使用委托方法在控制器中执行所有操作。如果你碰到了委托方法不会处理的东西,那么子类化,但是在视图类实现中尽可能少地改变。

答案 1 :(得分:1)

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

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

class ImageCaptionTextView: UITextView, UITextViewDelegate {

    var delegate: UITextViewDelegate!

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

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

然后在你的UIViewController中,你通过引用你的UITextView初始化该变量。故事板中的插座应该可以解决问题。如果你以编程方式设置了UIView,那就更容易了。

IBOutlet方式:

@IBOutlet weak var imageCaptionTextView: UITextView!

// later in the code

imageCaptionTextView.delegate = self

编程方式:

let imageCaptionTextView = ImageCaptionTextView()
imageCaptionTextView.delegate = self

那你应该好;)

答案 2 :(得分:0)

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

在父VC中(原谅我,如果它在obj-c中):

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

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