Swift 2.0:代表不工作

时间:2016-02-26 09:55:55

标签: ios delegates swift2

我创建了这个类(customAccessaryView)并扩展了UIView我在UIToolbar上显示的.xib上的完成和取消按钮的位置。

请查看以下屏幕截图以获取更多信息。

enter image description here

在我的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()
  }

但我没有强有力地提供它。

1 个答案:

答案 0 :(得分:1)

编辑:这个答案错了​​:)我错过了textFieldShouldBeginEditing:中的一行。

在你的视图中加载了你的行

self.customAV = customAccessaryView()
self.customAV?.delegate = self

第一行不符合您的期望 - 我假设您想要从故事板中获取您创建的customAccessoryView并设置它的委托?你真正在做的是创建一个新的CustomAccessoryView并设置它的委托。您永远不会将其添加到您的视图中,因此您委派的实例不是您在屏幕上看到的实例。

您需要将您的房产作为出口

@IBOutlet var customAV: customAccessaryView!

将它附在故事板中,添加到您在那里创建的视图中。然后从viewDidLoad中删除第一行,这样您就可以使用故事板中的那一行。

注意这里有一些(可能是不受欢迎的)建议:

Swift中的类应该以大写字母开头,即customAccessaryView应该是CustomAccessaryView。协议也是如此。事物的实例以小写字母开头,因此您在阅读代码时可以轻松区分它们。

您已将委托方法设为可选,但在调用时使用!。如果您打算这样做,为什么还要在协议中选择它? (或者如果您希望它是可选的,请改用delegate.clickONDone?()