我创建了这个类(customAccessaryView)并扩展了UIView
我在UIToolbar
上显示的.xib
上的完成和取消按钮的位置。
请查看以下屏幕截图以获取更多信息。
在我的customPickerView类中,我已经声明了我的协议方法和委托,并通过.xib
绑定了 doneAction 和 cancelAction 。
类:customAccessaryView
@objc protocol customAccessaryDelegate {
optional func clickONDone()
optional func clickONCancel()
}
class customAccessaryView : UIView {
var customView: UIView!
var delegate:customAccessaryDelegate?
override init(frame: CGRect) {
super.init(frame: frame)
self.customView = NSBundle.mainBundle().loadNibNamed("CustomAccessary", owner: self, options: nil)[0] as? UIView
self.addSubview(self.customView)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
@IBAction func doneAction(sender: AnyObject) {
if let delegate = self.delegate {
delegate.clickONDone?()
}
else {
print("Not Called")
}
}
@IBAction func cancelAction(sender: AnyObject) {
if let delegate = self.delegate {
delegate.clickONCancel?()
}
else {
print("Not Called")
}
}
}
当我将委托分配给另一个类(createEvent)时,协议方法不会调用。
类:createEvent
class createEvent : UIViewController, customAccessaryDelegate {
var txtFieldInstance: UITextField!
var customAV: customAccessaryView!
override func viewDidLoad() {
super.viewDidLoad()
self.customAV = customAccessaryView()
self.customAV?.delegate = self
}
func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
self.txtFieldInstance = textField
textField.inputAccessoryView = self.customAV
return true
}
func clickONDone() {
self.txtFieldInstance.resignFirstResponder()
}
func clickONCancel() {
}
}
因为我使用customAccessaryView在键盘中显示inputAccessoryView来处理完成和取消操作。
此外,我已分配了委托并调用了所需的方法,但它没有调用它。
非常感谢任何帮助。
更新
当我在init
类的customAccessaryView
方法中强制声明委托时,它正在工作。请查看以下代码。
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.delegate = createEvent()
}
但我没有强有力地提供它。
答案 0 :(得分:1)
编辑:这个答案错了:)我错过了textFieldShouldBeginEditing:
中的一行。
在你的视图中加载了你的行
self.customAV = customAccessaryView()
self.customAV?.delegate = self
第一行不符合您的期望 - 我假设您想要从故事板中获取您创建的customAccessoryView并设置它的委托?你真正在做的是创建一个新的CustomAccessoryView并设置它的委托。您永远不会将其添加到您的视图中,因此您委派的实例不是您在屏幕上看到的实例。
您需要将您的房产作为出口
@IBOutlet var customAV: customAccessaryView!
将它附在故事板中,添加到您在那里创建的视图中。然后从viewDidLoad中删除第一行,这样您就可以使用故事板中的那一行。
注意这里有一些(可能是不受欢迎的)建议:
Swift中的类应该以大写字母开头,即customAccessaryView
应该是CustomAccessaryView
。协议也是如此。事物的实例以小写字母开头,因此您在阅读代码时可以轻松区分它们。
您已将委托方法设为可选,但在调用时使用!
。如果您打算这样做,为什么还要在协议中选择它? (或者如果您希望它是可选的,请改用delegate.clickONDone?()
。