首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UILabel不显示inputView

UILabel不显示inputView
EN

Stack Overflow用户
提问于 2012-10-12 05:54:52
回答 7查看 6.3K关注 0票数 6

我将使用UILabel来允许用户使用UIDatePicker选择日期。

为此,我创建了一个UILabel子类,覆盖了inputView和inputAccessoryView属性,使它们可写;我还实现了-(BOOL) canBecomeFirstResponder和-(BOOL) isUserInteractionEnabled方法,这两个方法都返回YES。然后,我为inputView属性分配了一个UIDatePIcker实例。

在这一点上,我的预期是,当标签被点击时,应该会出现一个UIDatePicker,但什么也不会发生。

有什么帮助吗?

代码如下:

代码语言:javascript
复制
YPInteractiveUILabel.h

@interface YPInteractiveUILabel : UILabel
    @property (readwrite) UIView *inputView;
    @property (readwrite) UIView *inputAccessoryView;

- (BOOL) canBecomeFirstResponder;
- (BOOL) isUserInteractionEnabled;
@end


YPInteractiveUILabel.h

#import "YPInteractiveUILabel.h"

@implementation YPInteractiveUILabel

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];

    if (self)
    {
        UIDatePicker *datePicker = [[UIDatePicker alloc] init];
        [self  setInputView:datePicker];
    }

    return self;
}

- (BOOL)isUserInteractionEnabled
{
    return YES;
}

- (BOOL)canBecomeFirstResponder
{
    return YES;
}

@end
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-10-12 22:12:24

多亏了这些建议(特别是来自NeverBe的评论和rdelmar提出的答案),我发现了代码中的问题。简而言之,为了显示输入标签,需要在用户点击标签时调用becomeFirstResponder方法。

更正了UILabel子类实现之后(头文件保持不变):

代码语言:javascript
复制
@implementation YPInteractiveUILabel

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];

    if (self)
    {
        UIDatePicker *datePicker = [[UIDatePicker alloc] init];
        [self  setInputView:datePicker];

        UITapGestureRecognizer *tapper = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(launchPicker:)];
        [self addGestureRecognizer:tapper];

    }

    return self;
}

- (BOOL)isUserInteractionEnabled
{
    return YES;
}

- (BOOL)canBecomeFirstResponder
{
    return YES;
}

-(void)launchPicker:(UITapGestureRecognizer *) tapper
{
    [self becomeFirstResponder];
}


@end
票数 3
EN

Stack Overflow用户

发布于 2016-08-06 19:18:36

UILabel + UIDatePicker --带有完成按钮的Swift版本。

代码语言:javascript
复制
import UIKit

class DatePickerLabel: UILabel {

    private let _inputView: UIView? = {
        let picker = UIDatePicker()
        return picker
    }()

    private let _inputAccessoryToolbar: UIToolbar = {
        let toolBar = UIToolbar()
        toolBar.barStyle = UIBarStyle.Default
        toolBar.translucent = true

        toolBar.sizeToFit()

        return toolBar
    }()

    override var inputView: UIView? {
        return _inputView
    }

    override var inputAccessoryView: UIView? {
        return _inputAccessoryToolbar
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Plain, target: self, action: #selector(doneClick))
        let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil)

        _inputAccessoryToolbar.setItems([ spaceButton, doneButton], animated: false)

        let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(launchPicker))
        self.addGestureRecognizer(tapRecognizer)
    }

    override func canBecomeFirstResponder() -> Bool {
        return true
    }

    @objc private func launchPicker() {
        becomeFirstResponder()
    }

    @objc private func doneClick() {
        resignFirstResponder()
    }

}
票数 10
EN

Stack Overflow用户

发布于 2015-04-29 17:28:27

您可以像在Apple documentation中解释的那样,直接使用inputView getter方法

代码语言:javascript
复制
- (UIView *)inputView {
    return myInputView;
}
- (BOOL)canBecomeFirstResponder {
    return YES;
}

然后添加一个手势或按钮来调用becomeFirstResponder:

代码语言:javascript
复制
- (void)showInputView:(id)sender {
     [self becomeFirstResponder];
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12849146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档