创建继承自BaseViewController的TableViewController和UIViewController

时间:2016-08-24 11:06:34

标签: ios swift uitableview uiviewcontroller

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

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中构造的,那么刷新一些错误会导致tableView跳转。

但是,如果NewsFeedVC和NotificationVC继承自下面的UItableViewController,我将无法再使用BaseVC中的函数了。我怎样才能构建这个以实现我的目标?

class NewsFeedVC: UITableViewController { }
class MakePostVC: UITableViewController { }

3 个答案:

答案 0 :(得分:4)

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

在你 BaseVC 中添加: -

BaseViewController
您的NewsFeedVC中的

声明了 prtotocol baseVCDelegate{ func activityIndic() func checkInternetConnect() } class BaseVC : UIViewController{ .... var delegate : baseVCDelegate! .... .. func activityIndic(){ .. .. } .. func checkInternetConnect(){ .. .. } }

类型的变量
NewsFeedVC

BaseVC

中将其委托人分配给自己
 var baseVCHandler : BaseVC = BaseVC()

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

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

答案 1 :(得分:1)

extension创建UIViewController,并将所有这些常用方法放在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文件并根据需要命名。并为上述任何类创建扩展。

稍后您可以将这些方法称为self.hideActivityIndicator()

答案 2 :(得分:0)

我建议修复拉动以刷新bug而不是错过你的结构。我使用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所具有的功能。   这可能会导致一些无法解决的新问题取决于   控制器的功能。