Кнопка Xamarin видна в симуляторе iOS, но не на устройстве

Я новичок в Xamarin, но немного разбираюсь в iOS, мне дали чужой код, чтобы исправить некоторые ошибки. Я немного погуглил, но не могу решить эту.

Все работает нормально при развертывании на Android, развертывании на iPhone 4/iOS 7.1.2 и имитации iPhone 6/iOS 9.3 в симуляторе iOS.

Проблема

Кнопка btnNews видна в симуляторе iOS (iPhone 6/iOS 9.3), но не видна, когда код развернут на iPhone 6/iOS 9.3.1.

MainPage.xaml в переносимом проекте

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:c="clr-namespace:Cookies;assembly=Cookies"
             x:Class="MyCompany.MainPage" Title="MyCompany">
  <Grid ColumnSpacing="1" RowSpacing="0">
    <Grid.RowDefinitions>
      <RowDefinition Height="*" />
      <RowDefinition Height="50" x:Name ="buttonsRow"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="*"/>
      <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <c:CookieWebView x:Name="webView" Grid.Row="0" Grid.ColumnSpan="2">
    </c:CookieWebView>
    <ActivityIndicator x:Name="activityIndicator"
          VerticalOptions="FillAndExpand" HorizontalOptions="Center" Grid.Row="0" Grid.ColumnSpan="2" />
    <Button x:Name="btnNews" Text="back to news list" BackgroundColor="#E15F59" BorderRadius="0" BorderColor="#E15F59"
            TextColor="White" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" BorderWidth="0" IsVisible="False"
            HorizontalOptions="FillAndExpand"/>
  </Grid>
</ContentPage>

MainPage.xaml.cs MainPage()

namespace MyCompany
{
    public partial class MainPage : ContentPage
    {
        private Button _btnNews;
        private ActivityIndicator Loader { get; set; }
        private RowDefinition _row;

        public const string URL_NEWS = "http://www.mycompany.com/";
        public const string QUERY = "master=app";
        public static CookieWebView WebView;
        public static string CurrentUrl;
        bool externalUrlClicked = false;

        public MainPage(string url = null)
        {
            InitializeComponent();

            // cookies common : https://github.com/seansparkman/CookiesWebView + nuget package CookiesWebView nuget : https://www.nuget.org/packages/CookieWebView/1.0.0
            // ios: http://stackoverflow.com/questions/29768019/cookies-in-web-view-xamarin-ios

            NavigationPage.SetHasNavigationBar(this, false);

            WebView = this.FindByName<CookieWebView>("webView");
            _row = this.FindByName<RowDefinition>("buttonsRow");
            Loader = this.FindByName<ActivityIndicator>("activityIndicator");

            WebView.Navigated += _webView_Navigated;
            WebView.Navigating += WebView_Navigating;

            var source = new UrlWebViewSource();
            source.Url = GetUrl(!string.IsNullOrEmpty(url) ? url : URL_NEWS);
            WebView.Source = source;

            ReadCookiesFromSettings();

            _btnNews = this.FindByName<Button>("btnNews");
            _btnNews.Clicked += _btnNews_Clicked;

            // Keep free from iPhone status bar
            this.Padding = new Thickness(0, Device.OnPlatform(20, 0, 0), 0, 0);
        }
    }
}

MainPage.xaml.cs _webView_Navigated()

Этот метод запускается всякий раз, когда нажимается ссылка в веб-представлении. Если URL-адрес является «страницей новостей», то btnNews («Назад к списку новостей») должен отображаться, иначе btnNews должен быть скрыт. Я установил точки останова, чтобы убедиться, что правильные блоки if/else запускаются в соответствующее время. Развернутое приложение использует те же URL-адреса/веб-контент, что и смоделированное приложение.

public void _webView_Navigated(object sender, CookieNavigatedEventArgs args)
{
    if (externalUrlClicked)
    {
        args.Url = CurrentUrl;
        externalUrlClicked = false;

        return;
    }
    else
        CurrentUrl = args.Url;

    if (args.Url != GetUrl(URL_NEWS))
    {
        _row.Height = 50;
        _btnNews.IsVisible = true;
    }
    else
    {
        _row.Height = 0;
        _btnNews.IsVisible = false;
    }

    try
    {
        var cookie = WebView.Cookies[Settings.CookiesSettingsKey];

        Settings.CookiesSettings = cookie.Value;
    }
    catch (Exception)
    {
    }

    Loader.IsVisible = Loader.IsRunning = false;
}

В нативном приложении для iOS я бы начал исследовать макет и такие вещи, как setNeedsDisplay, но я еще не нашел, как это сделать с Xamarin.

Спасибо за помощь!


person camelBase    schedule 17.05.2016    source источник
comment
Пробовали ли вы отлаживать код, если он фактически переходит в код _btnNews.IsVisible = true; при развертывании на вашем физическом iPhone 6.   -  person Akash Amin    schedule 18.05.2016
comment
Спасибо за ваш ответ @AkashAmin. Да, я пытался, но мой метод визуальной отладки не работает на iPhone 6. Я изучаю это прямо сейчас, но решил все равно опубликовать вопрос, чтобы исключить любые другие очевидные ошибки новичка в Xamarin. Я обновлю вопрос, если узнаю больше.   -  person camelBase    schedule 18.05.2016