Ios Swift 2.0:代理未工作
我已经创建了类(customAccessaryView)并扩展了Ios Swift 2.0:代理未工作,ios,delegates,swift2,Ios,Delegates,Swift2,我已经创建了类(customAccessaryView)并扩展了UIView,我在UIToolbar上显示了我从.xib加载的“完成”和“取消”按钮 请查看下面的屏幕截图以了解更多信息 在customPickerView类中,我声明了我的协议方法和委托,并通过.xib绑定了doneAction和cancelAction 类别:customAccessaryView @objc protocol customAccessaryDelegate { optional func clickON
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来处理完成和取消操作
我还分配了委托并调用了所需的方法,但它没有调用它
非常感谢您的帮助
更新
当我在customAccessaryView
类的init
方法中强制声明委托时,它正在工作。请查看下面的代码
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.delegate = createEvent()
}
但是我没有强制提供它。编辑:这个答案是错误的:)我错过了
文本字段shouldBeginediting:
中的一行
在你看来,你有这些线吗
self.customAV = customAccessaryView()
self.customAV?.delegate = self
第一行没有达到您期望的效果-我假设您希望获取从故事板创建的customAccessoryView并将其设置为委托?您实际要做的是创建一个新的CustomAccessoryView并设置它的委托。您从未将其添加到视图中,因此您作为代理的实例不是您在屏幕上看到的实例
你需要让你的房子成为一个出口
@IBOutlet var customAV: customAccessaryView!
并将其附加到故事板中您在其中创建的视图。然后从viewDidLoad中删除第一行,以便始终使用故事板中的那一行
注意:以下是一些(可能不受欢迎的)建议: Swift中的类应该以大写字母开头,即
customAccessaryView
应该是customAccessaryView
。协议也是如此。事物的实例以小写字母开头,因此在阅读代码时可以轻松地将它们区分开来
您已将委托方法设置为可选,但随后将使用
代码>当你调用它时。如果你要这么做,为什么要在协议中让它成为可选的呢?(或者如果您希望它是可选的,请使用delegate.clickONDone?()
。什么工作不正常?在doneAction()
中,打印为“未调用”或doneAction()
甚至未调用?我已经更新了问题并实际单击了Ondone())CeaEngEnter类中的方法不称为委托。感谢您关于创建类的答案和指南。正如您提到的“您从不将它添加到您的视图中”,正如我在“输入-附件”视图中使用的那样,它是否可以考虑。如果我错了,请更正我。HMM,这意味着我的答案是错误的:接下来我要看的是,您的委托在CustomAccessaryView中是否仍然设置正确-当您单击按钮时,您是否在控制台中看到“Not Called”(未调用)?我没有说您的答案是错误的,但它对我不起作用。是的,我在控制台中得到“未调用”。如果您有时间,请查看它,因为我在过去的3到4天里一直在努力,不知道它为什么不起作用。我已经更新了我的问题,请查看它@deanWombourne。您可以尝试从行self.customAV?中删除?
?(我现在猜,您的代码看起来应该可以工作!)