Xamarin.Forms(iOS) - 如何更改SearchBar的文本"取消"按钮?

时间:2017-08-18 17:45:42

标签: c# xamarin xamarin.ios xamarin.forms uisearchbar

我们正在将我的团队正在开发的移动应用程序国际化,我注意到"取消" SearchBar中的按钮没有翻译(其他一切都正常翻译) - 它总是说"取消"无论用什么语言,我都会将iPad模拟器改为。如果我可以自己设置文本,那么我可以确保它正确地国际化。所以......

如何更改"取消" Xamarin.Forms SearchBar上的按钮文字?我尝试过自定义渲染器,但我很难定位取消按钮子视图。 This answer似乎在解释如何在Objective C中执行此操作方面做得很好,但我在Xamarin.Forms框架中将其转换为C#时遇到了问题。

3 个答案:

答案 0 :(得分:4)

为iOS创建新的custom renderer。类似CustomSearchBarRenderer和子类Xamarin的原始SearchBarRenderer

public class CustomSearchBarRenderer : SearchBarRenderer { }

我可能会尝试覆盖OnElementChanged方法,并在基类完成所有工作后设置自定义标题。像这样:

protected override void OnElementChanged(ElementChangedEventArgs<SearchBar> e)
{
    base.OnElementChanged(e);

    var cancelButton = Control.FindDescendantView<UIButton>();
    cancelButton.Title = "Whatever";
}

编辑:请注意,cancelButton可能会在某个时刻重新创建,因此您可能还必须在其他位置设置标题。但是,这应该是一个很好的起点。

您还可以查看当前的SearchBarRenderer实现here

答案 1 :(得分:0)

我结合了答案,并在需要的每个事件上设置了按钮文本。我还修复了取消按钮的显示和隐藏(请参见here):

using FestivalHolledauApp.iOS;
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
using System.Linq;

[assembly: ExportRenderer(typeof(SearchBar), typeof(CustomSearchBarRenderer))]
namespace FestivalHolledauApp.iOS
{
    public class CustomSearchBarRenderer : SearchBarRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<SearchBar> e)
        {
            base.OnElementChanged(e);

            // Fixing Cancel button
            if (e.NewElement != null)
            {             
                this.Control.TextChanged += (s, ea) =>
                {
                    this.Control.ShowsCancelButton = true;
                    SetCancelButtonText();
                };

                this.Control.OnEditingStarted += (s, ea) => //when control receives focus
                {
                    this.Control.ShowsCancelButton = true;
                    SetCancelButtonText();
                };

                this.Control.OnEditingStopped += (s, ea) => //when control looses focus 
                {
                    this.Control.ShowsCancelButton = false;
                };
            }
        }

        private void SetCancelButtonText()
        {
            var cancelButton = Control.Descendants().OfType<UIButton>().FirstOrDefault();
            if (cancelButton != null)
            {
                cancelButton.SetTitle("Schließen", UIControlState.Normal);
            }
        }
    }
}

答案 2 :(得分:0)

我在...上遇到了同样的问题

  • UISearchBar中的“取消”按钮
  • “后退”按钮转到没有标题的前一页
  • 上下文菜单操作,例如“剪切”,“复制”和“粘贴”
  • 日期选择器和多行编辑器上的“完成”按钮

我用resource based localization进行了本地化。

resource based localization

有很多黑客可以找到本机按钮并手动设置文本,但是我知道这不是本来的方式。因此,我进行了更深入的研究,发现了Gerald Versluis撰写的以下精彩文章:

对我来说,这只是要将以下代码块添加到我的Info.plist中:

    <key>CFBundleLocalizations</key>
    <array>
        <string>en</string>
        <string>de</string>
    </array>

这样,iOS会自动转换当前系统区域性的所有UI元素(无需将这些文本添加到任何资源文件中)。

SearchBar BackButton