я уже видел эту статью;
Stackoverflow, как создать один экземпляр
Однако это без ответа, и мой вопрос еще немного углубится в детали.
У меня есть следующий ViewRenderer в IOS:
public class AdBanner_IOS : ViewRenderer<AdBanner, UIView> {
protected override void OnElementChanged(ElementChangedEventArgs<AdBanner> e) {
base.OnElementChanged(e);
if (e.OldElement == null) {
switch ((Element as AdBanner).Size) {
case AdBanner.Sizes.Standardbanner:
_bannerView = new BannerView(AdSizeCons.Banner, new CGPoint(0, 0));
break;
case AdBanner.Sizes.LargeBanner:
_bannerView = new BannerView(AdSizeCons.LargeBanner, new CGPoint(0, 0));
break;
case AdBanner.Sizes.MediumRectangle:
_bannerView = new BannerView(AdSizeCons.MediumRectangle, new CGPoint(0, 0));
break;
case AdBanner.Sizes.FullBanner:
_bannerView = new BannerView(AdSizeCons.FullBanner, new CGPoint(0, 0));
break;
case AdBanner.Sizes.Leaderboard:
_bannerView = new BannerView(AdSizeCons.Leaderboard, new CGPoint(0, 0));
break;
case AdBanner.Sizes.SmartBannerPortrait:
_bannerView = new BannerView(AdSizeCons.SmartBannerPortrait, new CGPoint(0, 0));
break;
default:
_bannerView = new BannerView(AdSizeCons.Banner, new CGPoint(0, 0));
break;
}
_bannerView.AdUnitID = Constants.Banner_AdUnitId;
var request = Request.GetDefaultRequest();
_bannerView.LoadRequest(request);
foreach (UIWindow uiWindow in UIApplication.SharedApplication.Windows) {
if (uiWindow.RootViewController != null) {
_bannerView.RootViewController = uiWindow.RootViewController;
}
}
SetNativeControl(_bannerView);
}
}
Это прекрасно работает, однако это означает, что он будет загружать каждую (новую) страницу снова и снова. Я хочу сохранить согласованность между объявлениями на разных страницах, и я думаю, что она также не должна загружаться и делать запросы на каждой другой странице. Вот почему я попытался сделать представление статичным и поместить его на новую страницу при загрузке. как это (через изменение rootviewcontroller);
public class AdBanner_IOS : ViewRenderer<AdBanner, UIView> {
private static BannerView _bannerView;
private static bool _loaded;
protected override void OnElementChanged(ElementChangedEventArgs<AdBanner> e) {
base.OnElementChanged(e);
if (_loaded) {
SetAdView();
return;
}
if (e.OldElement == null) {
switch ((Element as AdBanner).Size) {
case AdBanner.Sizes.Standardbanner:
_bannerView = new BannerView(AdSizeCons.Banner, new CGPoint(0, 0));
break;
case AdBanner.Sizes.LargeBanner:
_bannerView = new BannerView(AdSizeCons.LargeBanner, new CGPoint(0, 0));
break;
case AdBanner.Sizes.MediumRectangle:
_bannerView = new BannerView(AdSizeCons.MediumRectangle, new CGPoint(0, 0));
break;
case AdBanner.Sizes.FullBanner:
_bannerView = new BannerView(AdSizeCons.FullBanner, new CGPoint(0, 0));
break;
case AdBanner.Sizes.Leaderboard:
_bannerView = new BannerView(AdSizeCons.Leaderboard, new CGPoint(0, 0));
break;
case AdBanner.Sizes.SmartBannerPortrait:
_bannerView = new BannerView(AdSizeCons.SmartBannerPortrait, new CGPoint(0, 0));
break;
default:
_bannerView = new BannerView(AdSizeCons.Banner, new CGPoint(0, 0));
break;
}
_bannerView.AdUnitID = Constants.Banner_AdUnitId;
var request = Request.GetDefaultRequest();
_bannerView.LoadRequest(request);
_loaded = true;
SetAdView();
}
}
private void SetAdView() {
foreach (UIWindow uiWindow in UIApplication.SharedApplication.Windows) {
if (uiWindow.RootViewController != null) {
_bannerView.RootViewController = uiWindow.RootViewController;
}
}
SetNativeControl(_bannerView);
}
Это также работает нормально, пока я не вернусь к существующей странице в моем стеке навигации.
Тогда свойства ViewRenderer различаются, и функция SetNativeControl вызывает исключение, поскольку элемент пуст.
(Единственное, чего я хочу добиться, это вернуть представление баннера обратно на страницу)
Кто-нибудь видит, что я мог бы сделать по-другому, или также уже реализовал один экземпляр?