2016-09-30 3 views
4

표시 경고 팝업과 같은 일부 UI 관련 기능이 있거나 화면 중간에 활동 표시기를 표시하거나 사용자 지정 메시지가있는 UIView 화면에 애니메이션 표시를 표시합니다.
여러 번의 viewController (VC1, VC2는이 경우)에서 사용하고 싶으므로 자신을 반복하지 마십시오.
처음에는 두 VC에서 작동하는 다음 코드가 해당 기능을 수행하는 BaseVC에서 상속받습니다.
VC1은 tablelView가 포함 된 UIViewController이고 VC2는 collectionView가 포함 된 UIViewController입니다. 몇 가지 이유 때문에 그러나 보기 컨트롤러 간의 공유 UI 기능

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 
     } 
    } 
} 


는, 내가 대신 UICollectionViewController에서 직선있는 UITableViewController에 대한 VC1 및 VC2을하기로 결정.
이것은 UIViewController 클래스 인이 BaseVC에서 더 이상 볼 수 없다는 것을 의미합니다.

두 VC가 그 기능을 계속 수행 할 수 있도록 어떻게 만들 수 있습니까?

답변

0

왜 UIActivityViewController 자체를 하위 클래스로 만들지 않습니까? 더 논리적이고 깨끗합니다.

class VC1: UIViewController { 
    var customActivityIndicatorView: CustomActivityIndicatorView? = nil 

    func viewDidAppear(animated: Bool) { 
     if let view = view { 
      customActivityIndicatorView = CustomActivityIndicatorView(parentView: view) 
     } 
    } 

    func btnPressed() { 
     customActivityIndicatorView?.end() 
    } 
} 

class VC2: UITableViewController { 
    var customActivityIndicatorView: CustomActivityIndicatorView? = nil 

    func viewDidAppear(animated: Bool) { 
     if let view = view { 
      customActivityIndicatorView = CustomActivityIndicatorView(parentView: view) 
     } 
    } 

    func btnPressed() { 
     customActivityIndicatorView?.end() 
    } 
} 

class CustomActivityIndicatorView: UIActivityIndicatorView { 
    var isCustomViewOnScreen = false 

    convenience init?(parentView: UIView) { 
     if isAnimating == false { 
      self.init(frame: CGRect(x: 0, y: 0, width: 20, height: 20)) 
      center = parentView.center 
      hidesWhenStopped = true 
      activityIndicatorViewStyle = UIActivityIndicatorViewStyle.whiteLarge 
      color = UIColor.black 
      parentView.addSubview(self) 
      startAnimating() 
     } else { 
      return nil 
     } 
    } 

    func end() { 
     if isAnimating == true { 
      stopAnimating() 
      removeFromSuperview() 
     } 
    } 

    func animateACustomViewOnScreen() { 
     if isCustomViewOnScreen == false { 
      // Some animation code 
     } 
    } 

    func removeCustomView() { 
     if isCustomViewOnScreen == true { 
      // Some removal code 
     } 
    } 
} 
3

대답은 Protocol Extensions입니다. 당신은 프로토콜로 BaseVC을 정의하고이를 구현하는 클래스 전반에 걸쳐 사용되는 공유 논리를 추가하여 그 연장 :

(. BaseVC은 아래의 예에서 ActivityIndicatorDisplaying로 이름이 변경됩니다)

protocol ActivityIndicatorDisplaying { 

    var activityIndicator: UIActivityIndicatorView { get set } 
    var showsCustomView: Bool { get } 

    func showActivityIndicator() 
    func dismissActivityIndicator() 
} 

extension ActivityIndicatorDisplaying where Self: UIViewController { 

    func showActivityIndicator() { 
    if activityIndicator.isAnimating() { return } 

    activityIndicator.center = CGPointMake(view.bounds.width/2, view.bounds.height/2) 
    activityIndicator.hidesWhenStopped = true 
    activityIndicator.activityIndicatorViewStyle = .WhiteLarge 
    activityIndicator.color = UIColor.blackColor() 
    view.addSubview(activityIndicator) 
    activityIndicator.startAnimating() 
    } 

    func dismissActivityIndicator() { 
    activityIndicator.stopAnimating() 
    activityIndicator.removeFromSuperview() 
    } 

    func animateACustomViewOnScreen() { 
    if !showsCustomView { 
     // Some animation code 
    } 
    } 

    func removeCustomView() { 
    if showsCustomView { 
     // Some removal code 
    } 
    } 
} 

class VC1: UITableViewController, ActivityIndicatorDisplaying { 

    var activityIndicator = UIActivityIndicatorView() 
    var showsCustomView: Bool = false 

    override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 

    showActivityIndicator() 
    } 

    func btnPressed() { 
    dismissActivityIndicator() 
    } 
} 

class VC2: UICollectionViewController, ActivityIndicatorDisplaying { 

    var activityIndicator = UIActivityIndicatorView() 
    var showsCustomView: Bool = true 

    ... 
} 
+0

좋은 대답을 , 그러나'ActivityIndicatorDisplaying Self : UIViewController'는'UIView'가 여전히 작동 함을 보여줍니다. –

+0

'.addSubview'가 뷰 컨트롤러의'.view' 속성에서 호출되므로 작동하지 않습니다. UIView와 UIViewController 양쪽 모두와 함께 동작 시키려면'Self : UIViewController'를 제거하고 다음과 같이 프로토콜에서 다른 속성을 정의해야합니다 :'var view : UIView {get}' – ozgur

+0

이 솔루션이 더 많은 투표를해야하는 이유는 무엇입니까? 제이슨 한 명 한 명? 그의 방법은 모든 VC에 여분의 플래그를 도입하지 않습니다. – user125972

관련 문제