2012-10-11 46 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