我想使用xamarin.forms Renderer构建Wysiwyg编辑器作为自定义组件。我找到了一些解决方案,这是一个Xamarin.ios项目,它可以做我需要的事情:https://github.com/xam-consulting/teditor。我遵循提到的示例,并为Android实施了Wysiwyg渲染器,但我的iOS渲染器有问题。这是我的ViewRenderer<WysiwygEditor, UIView>
的Overriden方法:
protected override void OnElementChanged(ElementChangedEventArgs<WysiwygEditor> e)
{
base.OnElementChanged(e);
if (Control == null)
{
_view = new UIView();
_editorWebView = new UIWebView();
_view.Add(_editorWebView);
var interpretter = new JavaScriptEnterpretter(_editorWebView);
_jsApi = new RichEditorApi(interpretter);
_editorWebView.Delegate = new WysiwygWebViewClient(_jsApi, Element.Html);
_editorWebView.AutoresizingMask = UIViewAutoresizing.FlexibleWidth
| UIViewAutoresizing.FlexibleHeight
| UIViewAutoresizing.FlexibleTopMargin
| UIViewAutoresizing.FlexibleBottomMargin;
_editorWebView.KeyboardDisplayRequiresUserAction = false;
_editorWebView.ScalesPageToFit = true;
_editorWebView.BackgroundColor = UIColor.White;
_editorWebView.ScrollView.Bounces = false;
_keyboardDidFrameToken = NSNotificationCenter.DefaultCenter.AddObserver(UIKeyboard.DidChangeFrameNotification, KeyboardDidFrame);
_keyboardWillShowToken = NSNotificationCenter.DefaultCenter.AddObserver(UIKeyboard.WillShowNotification, KeyboardWillShowOrHide);
_keyboardWillHideToken = NSNotificationCenter.DefaultCenter.AddObserver(UIKeyboard.WillHideNotification, KeyboardWillShowOrHide);
BuildToolbar(Element.Toolbars);
interpretter.Init();
_jsApi.SetPlatformAsIOS();
SetNativeControl(_view);
}
if (e.OldElement != null)
{
e.OldElement.Cleanup();
}
if (e.NewElement != null)
{
e.NewElement.Initialize(_jsApi);
SetHtml("some html");
}
}
wysiwygeditor是我的类,它继承xamarin.forms.view。问题是JavaScript调用无法正常工作(例如_editorWebView.EvaluateJavascript("document.execCommand('bold', false, null)")
(。加载到_editorWebView
中的HTML包含一个带有contenteditable=true
属性的标签
所以,我的问题是:
- 如何将TeditorViewController从示例中移动到我的项目中正确的视图renderer?
- 在ViewRenderer中名为ViewController的属性的目的是什么?我应该覆盖它吗?
不确定我是否正确理解了您的问题。但这是我使用Xamarin.ios项目的现有viewController的方式。
如果要使用ViewRenderer(而不是Pagerenderer(,我只会初始化ViewController,然后在" SetNativeControl(...("中使用其视图。
TEditorViewController TController;
protected override void OnElementChanged(ElementChangedEventArgs<WysiwygEditor> e)
{
//Don´t call the base method here, since you want to create your own view.
if (Control == null)
{
//Initialize TController
TController = new TEditorViewController();
//etc.
SetNativeControl(TController.View);
}
}
以这种方式,您可以使用整个控制器并将其包装成呈渲染器。