使用 Monotouch 在 UISearchBar 上更改“取消”按钮的文本?

Posted

技术标签:

【中文标题】使用 Monotouch 在 UISearchBar 上更改“取消”按钮的文本?【英文标题】:Change text of “Cancel” button on a UISearchBar using Monotouch? 【发布时间】:2013-02-14 07:52:06 【问题描述】:

我需要将“取消”按钮的文本更改为始终在我的应用中显示“重置”。 我在 SO 上发现了很多 similar 问题,但所有答案都是针对 ObjC,而我在 Monotouch 工作。

【问题讨论】:

如果您提供 is 作为答案会更好(您可以在 SO 中回答您自己的问题,请参阅常见问题解答)并将其标记为已回答 - 这有助于人们寻找答案。 【参考方案1】:

使用下面的ios7+扩展方法:searchBar.SetCancelTitle("close");

它源自 Kolbjørn Bredrup 的评论,这很棒,但我不清楚它内部使用的附加扩展方法(OfType 和 FirstOrDefault)的命名空间是什么,所以我自己将它们添加到这个类中。

我还重命名了 UISearchBarExtensions 类,以便它与我的其他类很好地搭配。

感谢 Kolbjørn Bredrup 的原创!

和原来的一样,它被称为:

searchBar.SetCancelTitle("close");

public static class UISearchBarExtensions

    /// <summary>
    /// Finds the Cancelbutton
    /// </summary>
    /// <returns></returns>
    public static UIButton GetCancelButton(this UISearchBar searchBar)
    
        //Look for a button, probably only one button, and that is probably the cancel button.
        return (UIButton)searchBar.GetAllSubViews().OfType<UIButton>().FirstOrDefault();
    

    public static UIView FirstOrDefault(this IEnumerable<UIView> views)
    
        return ((List<UIView>)views)[0];
    

    public static IEnumerable<UIView> OfType<T>(this IEnumerable<UIView> views)
    
        List<UIView> response = new List<UIView>();
        foreach(var view in views)
        
            if(view.GetType() == typeof(T))
            
                response.Add(view);
            
        
        return response;
    

    /// <summary>
    /// Recursively traverses all subviews and returns them in a little list.
    /// </summary>
    /// <param name="view"></param>
    /// <returns></returns>
    public static IEnumerable<UIView> GetAllSubViews(this UIView view)
    
        List<UIView> retList = new List<UIView>();
        retList.AddRange(view.Subviews);
        foreach (var subview in view.Subviews)
        
            retList.AddRange(subview.GetAllSubViews());
        

        return retList;
    

    /// <summary>
    /// Sets the title of the search bars cancel button
    /// </summary>
    /// <param name="searchBar"></param>
    /// <param name="cancelTitle"></param>
    public static void SetCancelTitle(this UISearchBar searchBar, string cancelTitle)
    
        searchBar.GetCancelButton().SetTitle(cancelTitle, UIControlState.Normal);
    

【讨论】:

“我不清楚它内部使用的其他扩展方法的命名空间是什么” - 不需要所有自定义方法 - 只需使用:using System.Linq;【参考方案2】:

请注意,ios6 和 ios7 的子视图层次结构不同。

但是通过添加下面的扩展方法你可以使用

searchBar.SetCancelTitle("NO!");

适用于 ios7 和 ios5/ios6 的扩展方法:

public static class NimbleSearchBarExtensions

    /// <summary>
    /// Finds the Cancelbutton
    /// </summary>
    /// <returns></returns>
    public static UIButton GetCancelButton(this UISearchBar searchBar)
    
        //Look for a button, probably only one button, and that is probably the cancel button.
        return searchBar.GetAllSubViews().OfType<UIButton>().FirstOrDefault();
    

    /// <summary>
    /// Recursively traverses all subviews and returns them in a little list.
    /// </summary>
    /// <param name="view"></param>
    /// <returns></returns>
    public static IEnumerable<UIView> GetAllSubViews(this UIView view)
    
        List<UIView> retList = new List<UIView>();
        retList.AddRange(view.Subviews);
        foreach (var subview in view.Subviews)
        
            retList.AddRange(subview.GetAllSubViews());
        

        return retList;
    

    /// <summary>
    /// Sets the title of the search bars cancel button
    /// </summary>
    /// <param name="searchBar"></param>
    /// <param name="cancelTitle"></param>
    public static void SetCancelTitle(this UISearchBar searchBar, string cancelTitle)
    
        searchBar.GetCancelButton().SetTitle(cancelTitle,UIControlState.Normal);
    

【讨论】:

【参考方案3】:

这很容易 -

UIButton btnCancel = (UIButton)SearchBar.Subviews[3];
btnCancel.SetTitle ("test", UIControlState.Normal);

【讨论】:

以上是关于使用 Monotouch 在 UISearchBar 上更改“取消”按钮的文本?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MonoTouch 中使用 System.IO.Packaging

在 MonoTouch 中使用 Redpark SDK

MonoTouch 4.0 使用模拟器抛出 ReflectionTypeLoadException

Monotouch/WCF:如何在没有 svcutil 的情况下使用 wcf 服务

使用 monotouch 播放 mp3

我可以在 MonoTouch 项目中使用响应式扩展吗?