ObjCClass
является альтернативным синтаксисом для ObjCProtocols
.Возможно, вам не нужно делать и то, и другое.
Делегат по умолчанию присоединяется после загруженного события, поэтому ваш делегат может быть перезаписан снова.Вам нужно будет расширить ScrollView и переопределить метод attachNative
.
class MyScrollView extends ScrollView {
protected attachNative() {
(<any>ScrollView.prototype).attachNative.call(this);
if (isIOS) {
(<any>this)._delegate = FoodScrollDelegate.initWithOriginalDelegate((<any>this)._delegate);
this.nativeViewProtected.delegate = (<any>this)._delegate;
}
}
}
Зарегистрировать это MyScrollView
,
registerElement("MyScrollView", () => MyScrollView);
Теперь вы сможете использовать вместо MyScrollView
ScrollView
в вашем HTML, который переопределит делегат по умолчанию.Если вы хотите переопределить делегат для всех ScrollView, используемых в приложении, вы можете просто переопределить цепочку прототипов ScrollView
условно на iOS.
(<any>ScrollView.prototype).originalAttachNative = (<any>ScrollView.prototype).attachNative;
(<any>ScrollView.prototype).attachNative = function () {
this.originalAttachNative();
const newDelegate = FoodScrollDelegate.initWithOriginalDelegate(this._delegate);
this._delegate = newDelegate;
this.nativeViewProtected.delegate = newDelegate;
};
Если вы хотите запустить событие из делегата, тогда
scrollViewDidEndDraggingWillDecelerate(scrollView: UIScrollView, decelerate: boolean) {
const owner = (<WeakRef<ScrollView>>(<any>this._originalDelegate)._owner).get();
if (owner) {
owner.notify({
object: owner,
eventName: "dragEnd",
decelerate: decelerate
});
}
}
Теперь из Angular вы можете прослушать событие,
HTML
(dragEnd)="onDragEnd($event)"
TS
onDragEnd(event) {
console.log(event.decelerate);
}