创建继承自 BaseViewController 的 TableViewController 和 UIViewController

Posted

技术标签:

【中文标题】创建继承自 BaseViewController 的 TableViewController 和 UIViewController【英文标题】:Create TableViewController and UIViewController that both inherits from a BaseViewController 【发布时间】:2016-08-24 11:06:34 【问题描述】:

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

class BaseVC: UIViewController  
class NewsFeedVC: BaseViewController  
class MakePostVC: BaseViewController  
class NotificationVC: BaseViewController  
class MoreVC: BaseViewController  
class CollectionVC: BaseViewController  

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

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

class NewsFeedVC: UITableViewController  
class MakePostVC: UITableViewController  

【问题讨论】:

tableview跳转是什么意思? 【参考方案1】:

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

在你 BaseVC 中添加这个:-

  prtotocol baseVCDelegate

     func activityIndic()
     func checkInternetConnect()
 

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

   func checkInternetConnect()
   ..
    ..
    
   

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

 var baseVCHandler : BaseVC = BaseVC()

将其委托分配给viewDidLoad()中的自我

 baseVCHandler.delegate = self

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

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

【讨论】:

即使您没有从 baseVCDelegate 协议继承新闻源类,您如何分配“baseVCHandler.delegate = self”?【参考方案2】:

UIViewController 创建一个extension 并将所有这些常用方法放在extension

extension UIViewController

    func showActivityIndicator()
    
         // write your code to show Activity Indicator
    
    func hideActivityIndicator()
    
        // write your code to hide Activity Indicator
    

    func checkInternetConnection() -> Bool
    
        return true // write your code to check connection
    

创建扩展 xcode 文件菜单 -> 新建 -> 文件 -> 并选择 Swift File 并根据需要命名。并为上述任何类创建扩展。

以后你可以像self.hideActivityIndicator()这样调用这些方法

【讨论】:

【参考方案3】:

我建议修复下拉刷新错误,而不是错过你的结构。我使用 pull 刷新 UIViewController 并在其中使用 UITableView 没有问题。

refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged];
[refreshControl setTintColor:[self.stylingDetails themeColor]];
[oppTableView addSubview:refreshControl];

- (void)refresh:(UIRefreshControl *)refresh 

注意:

UITableViewController 失去了 UIViewController 拥有的功能。 这可能会给您带来无法解决的新问题,具体取决于 控制器的功能。

【讨论】:

那将是理想的!但是,您是否遇到过拉动刷新的“跳跃”问题?请看***.com/questions/31011734/… 几乎当你“慢慢”拉下tableview 刷新时,tableView 会在接近尾声时跳下 20 到 30 个点

以上是关于创建继承自 BaseViewController 的 TableViewController 和 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章

从 Swift 的 Objective-c 基础视图控制器继承

从 Storyboard 继承 ViewController

使用插座子类化主视图控制器

如何从自定义视图控制器类加载初始视图控制器

独特区分 UIView

处理 UIActionSheet