2017-11-29 16 views
0

私は4つのUIButtonを持つUIViewControllerを持っています。ユーザーはUIButtonのいずれかをタップするとUIViewがポップアップします。私はdidAppear()didDisappear()関数を、ユーザーの操作に応じてUIViewを保持しているクラスに追加したいと思います。どのように私は、たとえば、列挙型を使用せずにdidDisappear()呼び出すことができます。複数のクラスで同じ関数を呼び出す方法は?

func didDisappear(view: EnumViews){ 
    switch view{ 
     case view0: myClassWithView0.didDisappear() 
     case view1: myClassWithView1.didDisappear() 
     case view2: myClassWithView2.didDisappear() 
     case view3: myClassWithView3.didDisappear() 
    } 
} 

今、私は4回でデータを複製得ます。私は、UIViewを使ってクラスに関数が存在することを知っていますが、それを呼び出す方法は?私はプロトコルを作った:

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

私はUIViewのプロトコルに準拠しているクラスを作った。

'myClassWithUIView' cannot be constructed because it has no accessible initializers

クラスは、アレイ内のすべてであり、私はUIViewのはsender.tagからポップアップする必要が識別できます。しかし、私は、私はクラスを作成するとき、私はエラーを取得し、それを使用する方法がわかりません。理想的には、私はこのようなものを持っています:

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

答えて

1

ここでは多くのことが起こっています。私は簡単なものから始めます。

'myClassWithUIView' cannot be constructed because it has no accessible initializers

これは、あなたのクラスのイニシャライザがないことを意味します。したがって、myClassWithUIViewの実装内にはinitが必要です。 initを作成することで本当に助けになることはできません。クラスがどのように構造化されているのかわからないからですが、これはどうにかする方法を知っていると思われます。

@IBActionは問題ありません。クラスの配列があれば、うまくいくはずです。そうでない場合は投稿を編集してください。すでにdidDisappear関数は常にだけで変更しない理由ViewProtocolに準拠したビューに渡していることがわかっている場合、代わりに

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質問のために、あなたはこのような何かを行うことができます議論を簡単にする?

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

はい私は、人々に私が何を意味するかを見せるために簡単な言葉を使っています。 – NoKey

関連する問題