2015-08-25 3 views
0

У меня есть массив с разными UIViews, но эти UIView имеют тот же метод, который выполняет разные вещи, я бы назвал эти методы. Мой массив создается так же, как когда я пытался вызвать метод, его нет в классе UIView.Вызов пользовательской функции на UIView в массиве

import UIKit 

class ViewController: UIViewController { 
    override func viewDidLoad() { 
    super.viewDidLoad() 

    var pages:Array<UIView> = [] 

    let view1:View1 = View1(frame: CGRectMake(0, 0 , 100 , 100)) 
    view1.backgroundColor = UIColor.blueColor() 
    pages.append(view1) 

    let view2:View2 = View2(frame: CGRectMake(100, 100 , 100 , 100)) 
    view2.backgroundColor = UIColor.redColor() 
    pages.append(view2) 

    let view3:View3 = View3(frame: CGRectMake(200, 200 , 100 , 100)) 
    view3.backgroundColor = UIColor.orangeColor() 
    pages.append(view3) 

    //This work 
    for myView in pages { 
     self.view.addSubview(myView) 
    } 

    // I would like to call a generic function into a uiview class into array 
    for myView in pages { 
     myView.generic() 
    } 

    } 

    class View1: UIView { 

    override init(frame: CGRect ) { 
     super.init(frame: frame) 
    } 

    required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    func generic(){ 
     println("A, B, C") 
    } 

    } 

    class View2: UIView { 

    override init(frame: CGRect ) { 
     super.init(frame: frame) 
    } 

    required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    func generic(){ 
     println("X, Y, Z") 
    } 

    } 

    class View3: UIView { 

    override init(frame: CGRect ) { 
     super.init(frame: frame) 
    } 

    required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    func generic(){ 
     println("1, 2, 3") 
    } 

    } 

    override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
    } 
} 

ответ

0

Вместо того чтобы рассматривать эти взгляды UIView, их общий супер класс, мы можем объявить протокол и сделать эти взгляды все соответствовать ей.

protocol GenericProtocol { 
    func generic() 
} 

Теперь в определениях классов, добавьте соответствие:

class View1: UIView, GenericProtocol { /* ... */ } 
// for each class 

И теперь, давайте сделаем наш массив держать GenericProtocol объекты:

var pages = [GenericProtocol]() 

После того как мы заполнили его до , мы можем теперь на нем forin и называть все, что объявлено в GenericProtocol на своих членах:

for page in pages { 
    page.generic() 
} 
+0

Мир пирога, спасибо –

Смежные вопросы