如何在多个类上调用相同的函数?

时间:2017-11-29 23:00:44

标签: ios swift protocols

我有一个带有4个UIButton的UIViewController。用户可以点击任何这些UIButton并弹出UIView。我想在持有UIViews的类上添加didDisappear()didDisappear()函数,具体取决于用户操作。如何在不使用枚举的情况下调用func didDisappear(view: EnumViews){ switch view{ case view0: myClassWithView0.didDisappear() case view1: myClassWithView1.didDisappear() case view2: myClassWithView2.didDisappear() case view3: myClassWithView3.didDisappear() } } ,例如:

protocol ViewProtocol{
    func didAppear()
    func didDisappear()
}

现在我得到4次重复数据。我知道我的班级有一个UIView的功能,但是如何调用呢?我制定了一个协议:

@IBAction func bringNewUIView(_ sender: UIButton) {
let newView = myArrayOfClassesWithUIView[sender.tag]
newView.didAppear()
}

我让那些持有UIView符合该协议的类。但是我不知道如何使用它,当我创建类时出现错误:

  

'myClassWithUIView'无法构造,因为它无法访问   初始化

这些类都在一个数组中,我可以识别哪个UIView需要从sender.tag中弹出。理想情况下,我希望有这样的东西:

var plistDictionary:Dictionary<String, Any>? {
get {
    guard
        let path = Bundle(for: type(of: self)).path(forResource: "config", ofType: "plist"),
        let configDictionary = NSDictionary(contentsOfFile: path)
        else { return nil }
    return configDictionary as? Dictionary
}}

1 个答案:

答案 0 :(得分:1)

你这里有很多事情要做。我将从简单的开始。

  

'myClassWithUIView'无法构造,因为它没有可访问的初始值设定项

这只是意味着您的班级没有初始化程序。因此,在myClassWithUIView实施中,您需要init。我无法真正帮助你构建init,因为我不知道该类的结构如何,但我认为这是你知道如何做的事情。

您的@IBAction似乎很好。一旦你有一个类的数组似乎它应该工作。如果不是这样,请编辑您的帖子。

最后,对于您的didDisappear问题,您可以执行以下操作:

func didDisappear(view: EnumViews) {
  //Check to see if this view conforms to your ViewProtocol (that's not a good name, btw)
  if let myClass = view as? ViewProtocol {
    //Since it does conform to ViewProtocol you can call didDisappear on it
    myClass.didDisappear()
  }
}

或者,如果您已经知道didDisappear函数始终在符合ViewProtocol的视图中传递,为什么不只是更改参数并使其更容易?

func didDisappear(view: ViewProtocol) {
  view.didDisappear()
}