UILabel不显示inputView

我将使用UILabel来允许用户使用UIDatePickerselectdate。

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

在这一点上,我的期望是,当标签被点击时,UIDatePicker应该出现,但没有任何反应。

任何帮助?

这是代码:

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 

这样的事情呢? 而不是子类的标签,只需添加一个手势识别器,并调出水龙头识别器的处理程序中的select器。 在选取器的操作方法中,填充标签并closures选取器。 这个例子可以工作,但是你可能想添加一些animation来使它看起来更好:

 - (void)viewDidLoad { [super viewDidLoad]; self.label.userInteractionEnabled = YES; UITapGestureRecognizer *tapper = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(launchPicker:)]; [self.label addGestureRecognizer:tapper]; } -(void)launchPicker:(UITapGestureRecognizer *) tapper { UIDatePicker *picker = [[UIDatePicker alloc] initWithFrame:CGRectMake(5, 150, 300, 200)]; [picker addTarget:self action:@selector(updateLabel:) forControlEvents:UIControlEventValueChanged]; [self.view addSubview:picker]; } -(IBAction)updateLabel:(UIDatePicker *)sender { self.label.text = [NSString stringWithFormat:@"%@",sender.date ]; [sender removeFromSuperview]; } 

您可以只用ovveride inputView getter方法,就像Apple文档中所解释的那样:

 - (UIView *)inputView { return myInputView; } - (BOOL)canBecomeFirstResponder { return YES; } 

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

 - (void)showInputView:(id)sender { [self becomeFirstResponder]; } 

由于build议(特别是从NeverBe的评论和rdelmar提出的答案),我在我的代码中find了问题。 简而言之,为了显示input标签,需要用户点击标签时调用becomeFirstResponder方法。

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

 @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 

UILabel + UIDatePicker – 带完成button的Swift版本。

 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() } } 

我知道这是一个古老的问题,但这可能仍然是有用的人。

还有另一种方法可以解决这个问题 – 不需要用手势识别器来使事情复杂化。

GTPDateLabel.h

 @interface GTPDateLabel : UILabel @property (readonly, retain) UIView *inputView; @end 

GTPDateLabel.m

 #import "GTPDateLabel.h" @implementation GTPDateLabel @synthesize inputView = _inputView; - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.userInteractionEnabled = YES; } return self; } - (id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { self.userInteractionEnabled = YES; } return self; } -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesEnded:touches withEvent:event]; [self becomeFirstResponder]; } - (BOOL)canBecomeFirstResponder { return YES; } -(UIView *)inputView { if (!_inputView) { UIDatePicker *datePicker = [[UIDatePicker alloc] init]; _inputView = datePicker; } return _inputView; } @end 

请注意,你也应该设置delegate并在自定义的UIPickerdataSource情况下…