UITextField shouldBeginEditing 每隔一段时间调用一次?

Posted

技术标签:

【中文标题】UITextField shouldBeginEditing 每隔一段时间调用一次?【英文标题】:UITextField shouldBeginEditing called every other time? 【发布时间】:2014-01-12 00:48:55 【问题描述】:

不幸的是,ios 没有像 html 那样带有标签的下拉选择器。我决定我最终要为我的应用程序创建一个,它看起来和工作都很棒。我的下拉对象是 UITextField 的子类。然而,我改变了一些东西,现在它只在某些时候有效。

用户交互已启用,但我不希望文本字段可编辑。我的下拉子类所在的类是 UITextField 委托,并且应该接收 UITextField 的委托方法。

我有- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField,在那里我检查有问题的文本字段是否是下拉菜单,如果是,我调用一个方法来实例化弹出窗口并禁用编辑,但下拉菜单仅出现在其他每个点击上。

例如,我将点击“文本字段”并显示我的弹出框。我点击了弹出框,然后点击“文本字段”,没有任何反应。我再次点击文本字段并出现弹出框。不知道为什么会这样,这就是我正在做的事情:

.h

subclass : UIViewController<UITextFieldDelegate>

.m

dropdownTextField.delegate = self;
...
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
    if(textField == self.measurementSelect)
        NSLog(@"IM CALLED");
        [self showPopover:textField];
        return NO;
    
    return YES;


-(void)showPopover:(id)sender
    if (_measurementPicker == nil) 
        _measurementPicker = [[iPadMeasurementSelect alloc] initWithStyle:UITableViewStylePlain];
        _measurementPicker.delegate = self;
    

    if (_measurementPopover == nil) 
        _measurementPopover = [[UIPopoverController alloc] initWithContentViewController:_measurementPicker];
        [_measurementPopover presentPopoverFromRect:self.measurementSelect.frame inView:self.conversionView permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];

    
    else 
        [_measurementPopover dismissPopoverAnimated:YES];
        _measurementPopover = nil;
    

每次点击都会被 nslogged,所以我认为我的 popover 方法是这个问题的罪魁祸首。有什么想法吗?

【问题讨论】:

【参考方案1】:

让我们通过梳理 UI 元素的存在和弹出框的可见状态来重写:

// canonical lazy getters for UI elements

- (iPadMeasurementSelect *)measurementPicker 
    if (!_measurementPicker) 
        _measurementPicker = [[iPadMeasurementSelect alloc] initWithStyle:UITableViewStylePlain];
        _measurementPicker.delegate = self;
    
    return _measurementPicker;


- (UIPopoverController *)measurementPopover 
    if (!_measurementPopover) 
        _measurementPopover = [[UIPopoverController alloc] initWithContentViewController:self.measurementPicker];
    
    return _measurementPopover;


// now the show/hide method makes sense.  it can take a bool about whether to show or hide
-(void)showPopover:(BOOL)show 

    if (show) 
        [self.measurementPopover presentPopoverFromRect:self.measurementSelect.frame inView:self.conversionView permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];
     else 
        [self.measurementPopover dismissPopoverAnimated:NO];
        // if you want/need to create a new one each time it is shown, nil the popover here, like this:
        // self.measurementPopover = nil;
    

当 textField 开始编辑时,显示如下弹出框:

[self showPopover:YES];

当代理收到 didEndEditing 消息时:

[self showPopover:NO];

【讨论】:

像魅力一样工作!伟大的洞察力!

以上是关于UITextField shouldBeginEditing 每隔一段时间调用一次?的主要内容,如果未能解决你的问题,请参考以下文章

在 UITextField 操作中将 UITextField 字符串转换为 Double

如何调整 UITextField 占位符文本以适合 UITextField 宽度?

如果添加了新的 UITextField,如何向下移动许多 UITextField

如果 UITextField 已经创建,不要在 Tap 上重新创建 UITextField

使用未声明类型的 UITextfield

猫猫学iOS之UITextField右边设置图片,以及UITextField全解