Я использую 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?
Hi Artur Мне удалось обойти это с помощью подхода WebViewDelegate. что позволило мне получить UIWebView в событии LoadingFinished. Затем я смог вызвать сценарий и передать его параметры, обратившись к функции webView.EvaluateJavascript (...). Все идет нормально. –
Как ваш подход отличается от того, который использует XLabs? Я имею в виду, что ваш rendere имеет ту же «подпись» открытый частичный класс HybridWebViewRenderer: ViewRenderer? –
Я использую этот открытый публичный класс SessionWebViewRenderer: Xamarin.Forms.Platform.iOS.WebViewRenderer в рендерере, и это в делетете: внутренний класс WebViewDelegate: UIWebViewDelegate. Я обязательно посмотрю на XLabs. Благодарю. –