创建都继承自 BaseViewController 的 TableViewController 和 UIViewController

use*_*902 3 uitableview uiviewcontroller ios swift

我有五个视图控制器,它们都继承自一个基本视图控制器。我的 baseVC 包含共享功能,例如启动或停止活动标识符或检查互联网活动。VC 如下所示

class BaseVC: UIViewController { }
class NewsFeedVC: BaseViewController { }
class MakePostVC: BaseViewController { }
class NotificationVC: BaseViewController { }
class MoreVC: BaseViewController { }
class CollectionVC: BaseViewController { }
Run Code Online (Sandbox Code Playgroud)

我的 NewsFeedVC 和 NotificaitionVC(来自故事板)是由普通的 UIViewController 构建的,tableView 拖进来了。所以这一切都有效。但是,我正在考虑将故事板中的这两个 VC 更改为 UITableViewController 而不是将 tableView 拖到 viewController 中。这样做的原因是因为如果 tableView 是在 UIViewcontroller 中构造的,则在 pull to refresh 周围存在一些错误导致 tableView 跳转。

但是,如果 NewsFeedVC 和 NotificationVC 像下面这样从 UItableViewController 继承,我将无法再使用 BaseVC 中的功能。我该如何构建它以实现我的愿望?

class NewsFeedVC: UITableViewController { }
class MakePostVC: UITableViewController { }
Run Code Online (Sandbox Code Playgroud)

Dra*_*ian 5

在您BaseViewController希望NewsFeedVC类继承的函数中设置协议,然后使用委托调用它们

在您的BaseVC 中添加以下内容:-

  prtotocol baseVCDelegate{

     func activityIndic()
     func checkInternetConnect()
 }

  class BaseVC : UIViewController{
     ....
    var delegate : baseVCDelegate!
   ....
    ..
   func activityIndic(){
   ..
    ..
    }
   ..

   func checkInternetConnect(){
   ..
    ..
    }
   }
Run Code Online (Sandbox Code Playgroud)

在你NewsFeedVC声明一个类型的变量BaseVC

 var baseVCHandler : BaseVC = BaseVC()
Run Code Online (Sandbox Code Playgroud)

将其委托分配给 self viewDidLoad()

 baseVCHandler.delegate = self
Run Code Online (Sandbox Code Playgroud)

然后访问您的协议符合的任何功能!

PS:-通过这个https://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem,可能会帮助你理解为什么 swift 不喜欢类的钝多重继承背后的原因,会清除你的基础知识。