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
}
}
Dies ist eine etwas meinungsbasierte Frage (damit es geschlossen wird), aber Option 2 ist viel einfacher und benötigt viel weniger Code. – rmaddy
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
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