UITextField 突出显示所有文本
Posted
技术标签:
【中文标题】UITextField 突出显示所有文本【英文标题】:UITextField highlight all text 【发布时间】:2013-10-02 10:00:47 【问题描述】:我已经通过 *** 搜索了类似的问题,并找到了对其他人有用但没有一个对我有用的推荐解决方案,所以我开始怀疑这是我没有正确完成的事情。
这很简单。我想要的是,当用户点击 uitextfield 时,uitextfield 中的整个文本都会被选中。然后,用户可以继续将其全部删除,点击一次并从该点开始追加或开始输入以覆盖所有内容。
我有一个来自 uitextfield 的操作,这里是 sn-p。
- (IBAction)didBeginEditDescription:(id)sender
NSLog(@"Description began edit.");
[self.txtfield selectall:self];
我知道该方法被调用(从 NSLog 可见)。但是,什么也没有发生,光标仍然在文本的最后一个位置。我已经有了 UITextFieldDelegate,所以不确定我还应该看什么?
仅供参考,这是针对 Xcode 5.0 完成的,并正在尝试为 ios 7 开发。
我有什么明显的遗漏吗?
【问题讨论】:
【参考方案1】:我认为您想突出显示所选UITextField
的所有文本。在这种情况下,首先您应该确定哪个UITextField
调用了该方法(-didBeginEditDescription
),然后您可以为该特定UITextField
调用-selectAll
。
示例代码:
- (IBAction)didBeginEditDescription:(id)sender
NSLog(@"Description began edit.");
UITextField *txtFld = ((UITextField *)sender);
[txtFld selectAll:self];
更新:
-selectAll
应该可以工作。我已经实施了,它对我来说效果很好。请注意,您写的是-selectall
而不是-selectAll
。你也可以这样试试:
[txtFld setSelectedTextRange:[txtFld textRangeFromPosition:txtFld.beginningOfDocument toPosition:txtFld.endOfDocument]];
【讨论】:
我刚刚尝试过,但没有任何区别。这很奇怪,但我很欣赏你的回应。 @Gino:检查我的更新。 我复制了您的 sn-p,因此拼写错误已更正。我毫不怀疑这可能是正确的代码。这一定是我没有做的其他事情。您建议的替代方案也没有给我正确的结果。还有什么我应该做的吗?也许在 IB 上或代码中的其他地方? @Gino :我可以建议您在代码中看到的更改。我已经看到了您上面的代码,并告诉了您所需的更改。您必须使用断点逐行检查您的代码。只有我能告诉你的是“祝你好运”。 :)【参考方案2】:Xamarin iOS:
nativeTextField.EditingDidBegin += (object sender, EventArgs eIos) =>
nativeTextField.PerformSelector(new Selector("selectAll"), null, 0.0f);
;
适用于 iOS 的 Xamarin.Forms 自定义渲染器:
using System;
using CoreText;
using ObjCRuntime;
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
[assembly: ExportRenderer(typeof(Entry), typeof(MyEntryRenderer))]
namespace Hello.iOS
public class MyEntryRenderer : EntryRenderer
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
base.OnElementChanged(e);
if (Control != null)
var nativeTextField = (UITextField)Control;
nativeTextField.EditingDidBegin += (object sender, EventArgs eIos) =>
nativeTextField.PerformSelector(new Selector("selectAll"), null, 0.0f);
;
适用于 android 的 Xamarin.Forms 自定义渲染器:
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
base.OnElementChanged(e);
if (Control != null)
EditText editText = null;
for (int i = 0; i < ChildCount; ++i)
Android.Views.View view = (Android.Views.View)GetChildAt(i);
if (view is EditText) editText = (EditText)view;
editText?.SetSelectAllOnFocus(true);
【讨论】:
【参考方案3】:我发现有必要在TouchDown:
上调用selectAll:self
而不是editDidBegin:
在 InterfaceBuilder 中将 Touch Down
附加到 - (IBAction)didBeginEditDescription:(id)sender
。
【讨论】:
是的,我发现了同样的事情。请注意,它添加了选择句柄,这很烦人。【参考方案4】:对于 Xamarin.Forms,使用此方法创建自定义渲染器:
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
base.OnElementChanged(e);
if (e.NewElement == null) return;
Control.EditingDidBegin += (sender, e) => Control.PerformSelector(new ObjCRuntime.Selector("selectAll"), null, 0.0f);
【讨论】:
以上是关于UITextField 突出显示所有文本的主要内容,如果未能解决你的问题,请参考以下文章
iOS:带有 SecureEntry 的 UITextField 有时会用“强密码”文本突出显示黄色,然后键盘卡住
Swift 如何在另一个 UITextField 突出显示或具有值时禁用 TextField
如何通过在焦点集中时将其移动到键盘顶部/视图中心来突出显示滚动视图中的焦点 UITextField