2017-07-06 1 views
0

Bevor ich zu weit gehen, um dies zu implementieren, wollte ich wissen, was der optimale Weg zu implementieren Dinge in Bezug auf ContentOffest als UIScrollView verschoben wird.Welche verwenden? Delegate vs. keyPathObserver - UIViewController mit zwei UIScrollViews

HINWEIS: Eingestellte diese aus hat gelesen, dass mehr als ein Objekt mit einem Delegatmethode Aufruf problematisch sein kann

1) Hinzufügen von Beobachtern zu jedem der Content keyPaths Ansichten

2) meine Klasse eines Making UIScrollViewDelegate und mit scrollViewDidScroll

class MyAwesomeVC: UIViewController, UIScrollViewDelegate { 

@IBOutlet weak var scrollViewA: UIScrollView! 
@IBOutlet weak var scrollViewB: UIScrollView! 
private var observerContext = 0 

... 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     scrollViewA.delegate = self 
     scrollViewB.delegate = self 

     scrollViewA.addObserver(self, forKeyPath: "contentOffset", options: .new, context: &observerContext) 
     scrollViewB.addObserver(self, forKeyPath: "contentOffset", options: .new, context: &observerContext) 
    } 

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 

     // check which scrollview if possible then do all the things 

    } 


    func scrollViewDidScroll(_ scrollView: UIScrollView) { 

       // check which scrollview if possible then do all the things 

    } 

    ... 
    deinit { 
     scrollViewA.removeObserver(self, forKeyPath: "contentOffset", context: &observerContext) 
     scrollViewB.removeObserver(self, forKeyPath: "contentOffset", context: &observerContext) 
     scrollViewA = nil 
     scrollViewB = nil 
    } 


} 
+0

Dies ist eine etwas meinungsbasierte Frage (damit es geschlossen wird), aber Option 2 ist viel einfacher und benötigt viel weniger Code. – rmaddy

+0

Ich schaute darüber, ohne den Rest meines Codes in der Art und Weise, und hatte eine Art Nebenfrage - sind Delegate Methoden wie scrollViewDidScroll bereits von keyPathObservers ausgelöst? Ich fragte nur, weil beim Nachschlagen gab es Ansprüche, dass die Verwendung der Delegate-Methode mit mehr als einem Objekt aufrufen kann unordentlich werden. – solenoid

+0

Der Delegierte und KVO haben nichts miteinander zu tun. Aber es ist sinnlos, beide hier zu implementieren. Da für Ihre Anforderungen eine Delegate-Methode existiert, ist die Verwendung von KVO sinnlos. Innerhalb der Delegate-Methode können Sie einfach den Parameter "scrollView" mit Ihren beiden Outlet-Eigenschaften vergleichen, um zu erfahren, welche Bildlaufansicht gescrollt wurde. Sehr einfach. – rmaddy

Antwort

0

ich die sauberste Weg würde sagen, dies zu tun ist, um nur sich selbst als Delegierter Scroll-Ansicht zuweisen und überschreiben Sie die Funktion scrollViewDidScroll wie Sie haben, und print(scrollView.contentOffset) in der Funktion, und tun, was auch immer Sie damit brauchen. Wenn Sie überprüfen müssen, ob Sie nach unten scrollen, können Sie eine Eigenschaft an Ihre Klasse anhängen, die Ihr letztes contentOffset speichert und es einfach mit dem aktuellen vergleicht.

Verwandte Themen