调用由超类的子类实现的协议方法

时间:2016-04-29 11:24:13

标签: ios swift inheritance protocols

我有多个TableViewController类继承自基本的TableViewController类,如下所示:

class BasicTableViewController: UITableViewController {
}

class SpecificTableViewController: BasicTableViewController {
}

class AnotherSpecificTableViewController: BasicTableViewController {
}

然后我创建了一个非常简单的协议来为特定的viewcontroller类添加刷新功能,如下所示:

@objc
protocol Refreshable {
    func refresh()
}

我的特定viewcontroller类可以实现这样的协议:

class SpecificTableViewController: BasicTableViewController, Refreshable {
    func refresh() {
        getSomeDataFromServer()
    }
}

现在的问题是:从BasicTableViewController调用刷新方法的正确方法是什么,它本身不符合Refreshable协议?现在我正在做这样的事情(不确定它是否可行):

class BasicTableViewController: UITableViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        if let _ = self as? Refreshable {
            let refreshControl = UIRefreshControl()
            refreshControl.addTarget(self, action: #selector(Refreshable.refresh), forControlEvents: .ValueChanged)
            self.refreshControl = refreshControl
        }
    }
}

在一开始我没有使用@objc标记协议,并试图像这样构建选择器:#selector(refresh)。虽然没有奏效。希望得到一些澄清。 :)

提前感谢!

1 个答案:

答案 0 :(得分:1)

我会让Superclass实施Refreshable协议

protocol Refreshable {
    func refresh()
    func shouldBeRefreshable() -> Bool
}

//Making the protocol methods optional
extension Refreshable {
    func refresh() {}
    func shouldBeRefreshable() -> Bool { return false}
}

class SuperView: Refreshable {
    func addRefreshControl() {
        if shouldBeRefreshable() {
            //Add Refresh Control
        }else {
            // Do Nothing
        }
    }

    func shouldBeRefreshable() -> Bool {
        //default
        return false
    }
}

//Refreshable Class
class ChildA: SuperView {
   func refresh() {
        print("Refresh in Child A")
    }
    override func shouldBeRefreshable() -> Bool {
        return true
    }
}

//Not Refreshable Class
class ChildB: SuperView {
}