如何在Xamarin中实现指定UITextField外观设置?找不到setDefaultTextAttributes方法
解决Xamarin.iOS中无法调用UITextField Appearance的setDefaultTextAttributes方法的问题
嘿,我懂你碰到的这个坑!那段Objective-C代码是通过UIAppearance全局配置UISearchBar内部UITextField的默认文本样式,但在Xamarin.iOS里,直接用UITextField.AppearanceWhenContainedIn返回的对象确实找不到SetDefaultTextAttributes方法——这是因为Xamarin的绑定没有把这个UIAppearance专属的方法直接暴露出来。不过咱们有两种靠谱的解决思路:
方法一:通过PerformSelector调用原生方法(全局生效)
既然Xamarin允许我们调用原生OC的未绑定方法,我们可以用PerformSelector间接调用setDefaultTextAttributes:,效果和你原来的Objective-C代码完全一致,能全局设置所有UISearchBar里的UITextField:
// 获取UISearchBar内部UITextField的Appearance实例 var textFieldAppearance = UITextField.AppearanceWhenContainedIn(typeof(UISearchBar)); // 构建对应OC字典的文本属性 var textAttributes = new UIStringAttributes { ForegroundColor = UIColor.Green }; // 调用原生的setDefaultTextAttributes:方法 textFieldAppearance.PerformSelector( new ObjCRuntime.Selector("setDefaultTextAttributes:"), textAttributes.Dictionary );
方法二:直接访问UISearchBar的内部文本框(单个实例生效)
如果你不需要全局配置,只想针对某个特定的UISearchBar修改,可以直接获取它内部的_searchField(这是UISearchBar的私有属性,但实际开发中苹果是允许这么访问的):
// 假设你有一个UISearchBar实例searchBar var searchTextField = searchBar.ValueForKey(new NSString("_searchField")) as UITextField; if (searchTextField != null) { // 设置默认文本属性 searchTextField.DefaultTextAttributes = new UIStringAttributes { ForegroundColor = UIColor.Green }.Dictionary; }
小提醒
两种方法里的UIStringAttributes.Dictionary会自动转换成OC的NSDictionary,完美对应你原来代码里的@{NSForegroundColorAttributeName:[UIColor greenColor]}。
内容的提问来源于stack exchange,提问作者Pavlo Tunyk
相关产品推荐
相关产品推荐

