2014-07-07 46 views
2

我正在使用UIPicker填充UITextField而不是键盘。这很好,但我现在无法关闭UIPicker。我希望能够点击屏幕上的任何地方并关闭UIPicker。我已经尝试过每种触摸方法都不会触发。touchesBegan not called

setUserInteractionEnabled:YES。 不知道它是否有所作为,但我使用故事板

我应该在我的AppDelegate中设置一些东西来侦听触摸吗?

这里是我的.h

#import <UIKit/UIKit.h> 

@interface RNMemberTableViewController : UITableViewController<UIPickerViewDataSource, UIPickerViewDelegate, UITextFieldDelegate> 

@property (weak, nonatomic) IBOutlet UIPickerView *behaviorPicker; 
@property (nonatomic, weak) IBOutlet UIDatePicker *dateOfRecordPicker; 
@property (nonatomic, strong) NSArray *behaviorLevels; 
@property (weak, nonatomic) IBOutlet UITextField *behaviorTextField; 

@end 

这里是一些实施的...

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self.view setUserInteractionEnabled:YES]; 
    [self buildBehaviorPicker]; 
    NSLog(@"Member View"); 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSLog(@"test"); 
    [self.view touchesBegan:touches withEvent:event]; 
    UITouch *touch = [touches anyObject]; 
    int tCount = touch.tapCount; 
    NSLog(@"Touched %d", tCount); 
} 

- (void) buildBehaviorPicker 
{ 
    behaviorLevels = [[NSArray alloc] initWithObjects:@"Unsatisfactory", @"Needs Improvement", @"Satisfactory", @"Outstanding", nil]; 

    UIPickerView *pickerView = [[UIPickerView alloc] init]; 
    pickerView.dataSource = self; 
    pickerView.delegate = self; 
    [pickerView selectRow:2 inComponent:0 animated:NO]; 
    self.behaviorTextField.inputView = pickerView; 


} 

在此先感谢 -Bob

+2

鲍勃,如果你喜欢工作答案,相应地标记为“回答”。 – BonanzaDriver

回答

6

你总是可以尝试以下方法:

-(void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapReceived:)]; 
    [tapGestureRecognizer setDelegate:self]; 
    [self.view addGestureRecognizer:tapGestureRecognizer]; 
} 

-(void)tapReceived:(UITapGestureRecognizer *)tapGestureRecognizer 
{ 
    // do something, like dismiss your view controller, picker, etc., etc. 
} 

希望这有助于...

+2

这很好,但任何想法为什么touchesBegan不会开火?这是最佳做法吗?我对Obj-C非常陌生 – Bob

+2

我仍然想知道为什么touches方法不会触发 – Bob

+0

如果您在常规(非表视图控制器)上设置此选项,您将看到使用touchesBegan( ) - 桌子很漂亮。但是,正确的做法仍然是使用手势识别器。 – BonanzaDriver

0

您可以添加的透明按钮与选取器下的控制器视图大小相同。

设置button.hidden = NO当拾取器显示并设置为button.hidden = YES当拾取器被隐藏。

有办法隐藏选取器。最简单的方法是设置picker.hidden = YES

-5

如果您正在使用的UIScrollView然后

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 

不会被调用,为的touchesBegan是UIView的方法而不是UIScrollView的方法。

+14

实际上,touchesBegan是UIResponder的一种方法。 UIView从UIResponder继承,UIScrollView从UIView继承,所以这里推理不准确。 – davew