Xamarin.Forms 4.にしたらGoBackAsyncでOnNavigatedToが呼ばれなくなった件
2019年10月22日
Xamarin.iOSだけOnNavigatedTo()が呼ばれない。
Xamarin.Androidでは呼ばれてる。
Prismのisuueで過去にはそのようなバグがあったっぽいけど治ってるらしい。。
ググること数日。。。
見つけた。!∑(゜∀゜)
↓
OnNavigatedTo in Prism doesn’t trigger from one of pages
どうやら、ボタンのRendererがいけなかったらしい。
修正前
1 2 3 4 5 6 7 8 9 10 11 12 |
public class MyButtonRenderer : ButtonRenderer { public MyButtonRenderer() { } protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e) { base.OnElementChanged(e); if(!string.IsNullOrEmpty(Control.TitleLabel.Text)) Control.ContentEdgeInsets = new UIEdgeInsets(Control.ContentEdgeInsets.Top, Control.ContentEdgeInsets.Left + 20, Control.ContentEdgeInsets.Bottom, Control.ContentEdgeInsets.Right + 20); } } |
修正後
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public class MyButtonRenderer : ButtonRenderer { public MyButtonRenderer() { } protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e) { base.OnElementChanged(e); if (e.OldElement != null) { // unhook event handlers etc here } if (e.NewElement != null) { if (!string.IsNullOrEmpty(Control.TitleLabel.Text)) Control.ContentEdgeInsets = new UIEdgeInsets(Control.ContentEdgeInsets.Top, Control.ContentEdgeInsets.Left + 20, Control.ContentEdgeInsets.Bottom, Control.ContentEdgeInsets.Right + 20); } } } |
e.NewElement != nullの時に処理するようにしないと、ナビゲーションスタックからポップされてもRendererが動いちゃって、メモリにインスタンスが残り、その場合はNabigatedToが呼ばれないとのことらしい。
Rendererの実装では、そうゆう風にしてたんだけどこのソースだけやってなかった。(-_-;)
NMackay氏は神だ。