Ios Swift 2.0:代理未工作

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

我已经创建了类(customAccessaryView)并扩展了
UIView
,我在
UIToolbar
上显示了我从
.xib
加载的“完成”和“取消”按钮

请查看下面的屏幕截图以了解更多信息

在customPickerView类中,我声明了我的协议方法和委托,并通过
.xib
绑定了doneActioncancelAction

类别: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?中删除
?(我现在猜,您的代码看起来应该可以工作!)