我有一些与UI相关的功能,例如显示警告弹窗,在屏幕中央呈现活动指示器,或者展示带有自定义消息的UIView动画。
我想在多个视图控制器(VC1和VC2)中使用它们,以避免重复代码。
最初,我有以下代码,可以让两个继承自BaseVC的VC都能使用这些功能。
VC1是一个带有嵌入式tableView的UIViewController,VC2是一个带有嵌入式collectionView的UIViewController。
class VC1: BaseVC {
func viewDidAppear(animated: Bool) {
activityIndicatorBegin()
}
func btnPressed() {
activityIndicatorEnd()
}
}
class VC2: BaseVC {
func viewDidAppear(animated: Bool) {
activityIndicatorBegin()
}
func btnPressed() {
activityIndicatorEnd()
}
}
class BaseVC: UIViewController {
var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()
var isCustomViewOnScreen = false
func activityIndicatorBegin() {
if activityIndicator.isAnimating() == false {
activityIndicator = UIActivityIndicatorView(frame: CGRectMake(0,0,20,20))
activityIndicator.center = view.center
activityIndicator.hidesWhenStopped = true
activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.WhiteLarge
activityIndicator.color = UIColor.blackColor()
view.addSubview(activityIndicator)
activityIndicator.startAnimating()
}
}
func activityIndicatorEnd() {
if activityIndicator.isAnimating() == true {
activityIndicator.stopAnimating()
activityIndicator.removeFromSuperview()
}
}
func animateACustomViewOnScreen() {
if isCustomViewOnScreen == false {
// Some animation code
}
}
func removeCustomView() {
if isCustomViewOnScreen == true {
// Some removal code
}
}
}
然而,由于某些原因,我决定让VC1直接继承UITableViewController,而将VC2从UICollectionViewController中继承。
这意味着它们不再能从UIViewController类的BaseVC继承了。
我该如何使得这两个VC仍然可以调用那些函数呢?
UIView
,extension ActivityIndicatorDisplaying where Self: UIViewController
仍然有效吗? - Prashant Tukadiya.addSubview
是在视图控制器的.view
属性上调用的。如果你想让它能够同时与UIView和UIViewController一起使用,那么你应该删除where Self: UIViewController
并在协议中定义另一个属性,例如:var view: UIView { get }
。 - Ozgur Vatansever