创建继承自 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 基础视图控制器继承