Xamarin.Forms Wysiwyg:使用自定义渲染器将项目从Xamarion.ios移动到Xamarin.For



我想使用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属性的标签

所以,我的问题是:

  1. 如何将TeditorViewController从示例中移动到我的项目中正确的视图renderer?
  2. 在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);
    }
}

以这种方式,您可以使用整个控制器并将其包装成呈渲染器。

最新更新