【问题标题】:calling protocol method that is implemented by subclass from the superclass调用超类的子类实现的协议方法
【发布时间】:2016-04-29 11:24:13
【问题描述】:

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

class BasicTableViewController: UITableViewController {
}

class SpecificTableViewController: BasicTableViewController {
}

class AnotherSpecificTableViewController: BasicTableViewController {
}

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

@objc
protocol Refreshable {
    func refresh()
}

我的特定视图控制器类可以像这样实现协议:

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

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

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)。但这没有用。希望得到一些澄清。 :)

提前致谢!

【问题讨论】:

  • 为什么不想让BasicTableViewController符合Refreshable协议?
  • 看看我对 riik 解决方案的评论。如果视图控制器采用Refreshable 协议,我只想实现刷新控制。如果您有更好的方法进行检查,欢迎您提出。 :) 这就是我要的...

标签: ios swift inheritance protocols


【解决方案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 {
}

【讨论】:

  • 这种情况下的问题是我签入viewDidLoad 将不起作用,如果视图控制器实现Refreshable 协议,我只需要添加refreshControl...
  • 这可以工作,尽管我会将shouldBeRefreshable 方法标记为可选,因为我不想在所有没有刷新功能的子视图控制器中实现它...
  • 刚刚更新了答案 ;) 使方法可选,您可以使用协议扩展
猜你喜欢
  • 2015-05-25
  • 2017-11-25
  • 2016-08-19
  • 1970-01-01
  • 1970-01-01
  • 2014-11-08
  • 1970-01-01
  • 1970-01-01
  • 2015-04-14
相关资源
最近更新 更多