Xamarin Ad как единичный экземпляр - PullRequest
0 голосов
/ 27 июня 2019

я уже видел эту статью; 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 вызывает исключение, поскольку элемент пуст. (Единственное, чего я хочу добиться, это вернуть представление баннера обратно на страницу)

Кто-нибудь видит, что я мог бы сделать по-другому, или также уже реализовал один экземпляр?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...