2012-10-11 43 views
4

我会使用UILabel来允许用户使用UIDatePicker选择日期。UILabel不显示inputView

要做到这一点,我创建了一个子类的UILabel覆盖inputView和inputAccessoryView的性能,使其可写;我还实现了 - (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 
+1

尝试在init方法中添加self.userInteractionEnabled = YES。 – jsd

+0

为什么不使用UITextField呢? – rdelmar

+0

@jsd我试过了,但它不起作用。 – massyc

回答

3

感谢的建议(尤其是来自NeverBe的评论和建议rdelmar答案)我发现这个问题在我码。 简而言之,为了显示输入标签,需要在用户点击标签时调用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 
+1

也许这个工作在某个时间点,但是inputView现在只是readonly。 –

4

如何这样的事情。只需添加一个手势识别器,然后在水龙头识别器的处理程序中调出拾取器,而不是为其添加子类。在选取器的操作方法中,填充标签并关闭选取器。这个例子的工作,但你可能会想添加一些动画,使它看起来更好:

- (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]; 
} 
+0

这看起来像它会在技术上的工作,但只是添加一个子视图将.. ..不优雅。当然,您可以将它设置为原生输入视图,但是您可以重新发明轮子。仍然在寻找一个很好的解决方案,让UIDatePicker和UILabel一起玩,就好像它与UIText Field一样=( –

0

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

还有另一种方式来解决这个问题 - 是没有必要的事情与手势识别复杂...

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 ...

4

你可以只ovveride inputView getter方法,就像在​​解释说:

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

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

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

的UILabel + UIDatePicker - 带完成按钮的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() 
    } 

} 
+0

美丽,非常感谢! – Malfunction