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 突出显示所有文本的主要内容,如果未能解决你的问题,请参考以下文章

如何突出显示UITextField中的部分文本?

iOS:带有 SecureEntry 的 UITextField 有时会用“强密码”文本突出显示黄色,然后键盘卡住

Swift 如何在另一个 UITextField 突出显示或具有值时禁用 TextField

如何通过在焦点集中时将其移动到键盘顶部/视图中心来突出显示滚动视图中的焦点 UITextField

单击 JavaFX 突出显示 TextField 中的所有文本

如何在文本突出显示期间保留语法突出显示