如何引用子类的父视图控制器?
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
那你应该很好 ;)
在这里你可以看到我已经将我的 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
那你应该很好 ;)