0

我面临着有史以来最奇怪的错误(我的应用程序或 IOS 7.1 中的以太)。几个小时后,我设法创建了一个简单的应用程序来演示这个问题。

两个 UITextField - 从界面生成器拖放并连接到 t1、t2。视图控制器:

@implementation ViewController
@synthesize t1;
@synthesize t2;
#pragma mark - UITextFieldDelegate


-(void)textFieldDidBeginEditing:(UITextField *)iTextField {
    NSLog(@"textFieldDidBeginEditing");
    [iTextField performSelector:@selector(selectAll:) withObject:iTextField afterDelay:0.0];
}

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    return YES;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    t1.delegate = self;
    t2.delegate = self;
}

@end

同时点击 t1 和 t2 时,两个 textField 都会成为无限循环中的第一响应者!当省略执行选择器语句或 textField:shouldChangeCharactersInRange: 实现时,问题就消失了。

有人可以解释为什么会这样吗?

4

2 回答 2

1

编辑:还将每个的 ExclusiveTouch 属性设置UITextField为:YES 以防止它们同时编辑。

- (void)viewDidLoad
{
    [super viewDidLoad];
    t1.exclusiveTouch = YES;
    t2.exclusiveTouch = YES;
    t1.delegate = self;
    t2.delegate = self;
}

- (void)textFieldDidBeginEditing:(UITextField *)iTextField
{
    [iTextField performSelector:@selector(selectAll:) withObject:nil afterDelay:0.0];
}

或者更简单地说,不使用 ExclusiveTouch 属性:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)iTextField
{
    if (iTextField == t1 && t2.isFirstResponder == NO)
    {
        return YES;
    }
    else if (iTextField == t2 && t1.isFirstResponder == NO)
    {
        return YES;
    }

    return NO;
}
于 2014-07-12T03:52:55.610 回答
0

我尝试使用selectedTextRange属性 to 而不是selectAll,它使无限循环的问题消失了。

func textFieldDidBeginEditing(_ textField: UITextField) {
    DispatchQueue.main.async {
        let begin = textField.beginningOfDocument
        let end = textField.endOfDocument
        textField.selectedTextRange = textField.textRange(from: begin, to: end)
    }
}
于 2021-09-06T06:19:54.327 回答