我有五个视图控制器,它们都从一个基本视图控制器继承。我的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 { }
答案 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所具有的功能。 这可能会导致一些无法解决的新问题取决于 控制器的功能。