2015-08-04 2 views
0

Я использую Xamarin.Forms для создания кросс-платформенного приложения IOS Android и Windows Phone. Одним из моих взглядов является веб-представление, которое вызывает URL-адрес, указывающий на страницу с функцией javascript. Мне нужно вызвать эту функцию из мобильного приложения и передать ей строковое значение.Вызов функции JavaScript в Xamarin.Forms IOS WebViewRenderer

До сих пор все хорошо, я достигаю этого в WindowsPhone, используя WebViewRenderer с настраиваемым представлением. В OnElementPropertyChanged обработчика в визуализаторе я могу получить получить доступ к моему мнению и свойствам мне нужно так:

protected override async void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    base.OnElementPropertyChanged(sender, e); 

    if(e.PropertyName == SessionWebView.SessionIdProperty.PropertyName) 
    { 
     view = Element as SessionWebView;    

     Control.LoadCompleted += Control_LoadCompleted;   
     if (view != null) 
     { 
      _currentSessionId = view.SessionId; 
     } 
    } 
} 

Выше я прикрепить груз, полный обработчик контроля, который является фактическим BrowserControl. Затем ниже я могу вызвать нужную функцию JavaScript на веб-странице.

void Control_LoadCompleted(object sender, System.Windows.Navigation.NavigationEventArgs e) 
{  
    if (!scriptCalled) 
    { 
     Control.IsScriptEnabled = true; 
     var param = new string[1]; 
     param[0] = _currentSessionId; 
     Control.InvokeScript("initWebView", param); 
     scriptCalled = true; 
    }  
} 

Все это прекрасно работает в Windows Phone. В IOS - в чем заключается этот вопрос - я делаю что-то подобное с пользовательским Rendered, и я могу получить свое представление и его свойства.

Однако - я не могу получить элемент управления собственного браузера в IOS, чтобы иметь возможность вызвать функцию JavaScript на нем. Это то, что у меня есть до сих пор:

protected override void OnElementChanged(VisualElementChangedEventArgs e) 
{ 
    base.OnElementChanged(e); 
    if (_view == null && e.NewElement is SessionWebView) 
    { 
     _view = (SessionWebView) e.NewElement; 
     // Attach to the PropertyChanged event on the view 
     _view.PropertyChanged += _view_PropertyChanged; 
    } 
} 

private void _view_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    // Look for the sessionId propery 
    if (e.PropertyName == SessionWebView.SessionIdProperty.PropertyName) 
    { 
     if(_view != null && !string.IsNullOrEmpty(_view.SessionId)) 
     { 
      // if we have a view set the sessionId 
      _currentSessionId = _view.SessionId; 
      // Now need Browser to attach to loaded or navaigated events... 
     } 
    } 
} 

Любая идея о том, как я могу получить доступ к элементу управления браузера для вызова функции JavaScript?

ответ

1

У вас был взгляд на XLabs HybridWebView? https://github.com/XLabs/Xamarin-Forms-Labs/blob/master/src/Forms/XLabs.Forms.iOS/Controls/HybridWebView/HybridWebViewRenderer.cs Он основан на элементе управления UIWebView и использует метод UIWebView.EvaluateJavascript. Какой собственный браузер вы используете? Не могли бы вы показать полный код визуализации?

+0

Hi Artur Мне удалось обойти это с помощью подхода WebViewDelegate. что позволило мне получить UIWebView в событии LoadingFinished. Затем я смог вызвать сценарий и передать его параметры, обратившись к функции webView.EvaluateJavascript (...). Все идет нормально. –

+0

Как ваш подход отличается от того, который использует XLabs? Я имею в виду, что ваш rendere имеет ту же «подпись» открытый частичный класс HybridWebViewRenderer: ViewRenderer ? –

+0

Я использую этот открытый публичный класс SessionWebViewRenderer: Xamarin.Forms.Platform.iOS.WebViewRenderer в рендерере, и это в делетете: внутренний класс WebViewDelegate: UIWebViewDelegate. Я обязательно посмотрю на XLabs. Благодарю. –