【问题标题】:UITextField shouldBeginEditing called every other time?UITextField shouldBeginEditing 每隔一段时间调用一次?
【发布时间】: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 方法是这个问题的罪魁祸首。有什么想法吗?

【问题讨论】:

    标签: ios objective-c cocoa-touch uitextfield uipopovercontroller


    【解决方案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];
    

    【讨论】:

    • 像魅力一样工作!伟大的洞察力!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 2017-11-12
    • 2019-04-29
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    相关资源
    最近更新 更多