在这里你可以看到我已经将我的子类textView的委托设置为自己:
import Foundation
class ImageCaptionTextView: UITextView, UITextViewDelegate {
override func awakeFromNib() {
super.awakeFromNib()
delegate = self
}
现在在我的控制器中,我的委托方法不起作用。我正在使用ImageCaptionTextView子类中的所有ImageCaptionTextView委托方法,而不是之前的控制器类。
现在有一些代码需要添加到ImageCaptionTextView的控制器相关的textViewDidEndEditing委托方法,但是因为ImageCaptionTextView的委托方法是在ImageCaptionTextView子类中设置的,所以在控制器中添加的新代码将不起作用。
我开始怀疑我是否只是复杂的东西,应该尽可能多地移动代码到我可以回到控制器中。我只是觉得它让事情变得更清洁了。
所以我的问题是:
如何引用ImageCaptionTextView的父控制器,而不是将ImageCaptionTextView的委托设置为自身,我可以将其设置为控制器?
感谢您的时间。
答案 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中没有任何意义,那么我只是删除这个答案。但我希望它有所帮助!