0

I'm new to Xamarin but know some iOS, got someone else's code dumped in my lap to fix some bugs. I've googled quite a bit, but I can't solve this one.

Everything works fine deployed on Android, deployed on iPhone 4/iOS 7.1.2, and simulated as iPhone 6/iOS 9.3 in the iOS simulator.

Problem

The btnNews button is visible in the iOS simulator (iPhone 6/iOS 9.3) but not when the code is deployed to an iPhone 6/iOS 9.3.1.

MainPage.xaml in a portable project

<?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()

This method runs whenever a link is clicked in the web view. If the url is a "news item page" then btnNews ("Back to news list") should be shown, else btnNews should be hidden. I have set breakpoints to validate that the correct if/else blocks run at appropriate times. The deployed app uses the same urls/web content as the simulated app.

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;
}

In a native iOS app I would have started investigating layout and things like setNeedsDisplay, but I haven't yet found out how to do that with Xamarin.

Thanks for helping out!

camelBase
  • 917
  • 1
  • 8
  • 16
  • Have you tried debugging the code if the it actually goes to the `_btnNews.IsVisible = true;` code when deployed to your physical iPhone 6. – Akash Amin May 18 '16 at 04:45
  • Thank you for your answer @AkashAmin. Yeah, I've tried but my visual debugging method does not work on iPhone 6. I'm investigating that right now, but I thought I'd post the question anyway to exclude any other obvious Xamarin newbie mistakes. I'll update the question if I find out more. – camelBase May 18 '16 at 08:17

0 Answers0