UITextField突出显示所有文本

时间:2013-10-02 10:00:47

标签: iphone uitextfield ios7 xcode5 selectall

我已经通过stackoverflow搜索了类似的问题,并找到了适用于其他人的推荐解决方案,但没有一个能为我工作,所以我开始怀疑这是我没有做好的事情。

这很简单。我想要的是,当用户点击uitextfield时,uitextfield中的整个文本都会被选中。然后,用户可以继续全部删除,点按一次并从该点开始追加或开始输入以覆盖所有内容。

我有一个来自uitextfield的动作,这是片段。

- (IBAction)didBeginEditDescription:(id)sender
{
    NSLog(@"Description began edit.");

    [self.txtfield selectall:self];
}

我知道调用该方法(由NSLog显而易见)。但是,没有任何反应,光标仍然位于文本的最后位置。我已经有了UITextFieldDelegate所以不确定我还应该注意什么呢?

仅供参考,这是针对Xcode 5.0进行的,并尝试为iOS 7开发。

我有什么明显的遗失吗?

4 个答案:

答案 0 :(得分:9)

我想您要突出显示所选UITextField的所有文字。在这种情况下,首先您应该确定哪个UITextField调用了该方法(-didBeginEditDescription),然后您可以针对该特定-selectAll调用UITextField

示例代码:

- (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]]; 

答案 1 :(得分:3)

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);            

        }
    }

答案 2 :(得分:1)

我发现有必要将selectAll:self拨打TouchDown:而不是editDidBegin:

在InterfaceBuilder中将Touch Down附加到- (IBAction)didBeginEditDescription:(id)sender

答案 3 :(得分:1)

对于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);
}