簡體   English   中英

如何使用文本字段處理UItableViewCell的事件(內部/外部上移)?

[英]How to handle events (Touch Up Inside/Outside) for UItableViewCell with a text field?

我有一個自定義UITableViewCell,其中有一個文本字段。 我已經使用IB創建了它,並且有一個自定義類。

現在,我的問題是我想設置文本字段,以便在輸入文本期間,如果用戶在文本字段之外單擊(而不點擊鍵盤上的回車/完成鍵),則該字段會辭退第一響應者。 我了解,我需要處理Touch Up Inside事件。 但是,即使我已完成連接,我的tableview類也從未收到此事件。 我假設它是因為它不是UIcontrol的子類,因為它必須是UITableViewCel,所以我不能做到這一點。

那么解決方案是什么? 我如何接收這些事件?

頭文件:

#import <UIKit/UIKit.h>

@interface MMSingleTextFieldCell : UITableViewCell <UITextFieldDelegate>

// Properties
@property (weak, nonatomic) IBOutlet UITextField *singleTextField;
// Methods
- (IBAction)eventTouchUpOutside:(id)sender;
- (IBAction)eventTouchUpInside:(id)sender;
@end

類文件:

#import "MMSingleTextFieldCell.h"

@implementation MMSingleTextFieldCell

@synthesize singleTextField;


- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
    }
    return self;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}


- (IBAction)eventTouchUpOutside:(id)sender {
    [singleTextField resignFirstResponder];
}

- (IBAction)eventTouchUpInside:(id)sender {
    [singleTextField resignFirstResponder];

}

我最近剛剛在Github上開源了一個項目,該項目應該使這一切相對容易實現。 它包括一個可以輕松插入單元格的類和一個演示其功能的示例項目。

如果查看RootTableViewController的viewDidLoadMethod您將看到我正在添加一個手勢識別器:

    self.tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                        action:@selector(dismissKeyboard)];
    _tapGestureRecognizer.delegate = self;
    _tapGestureRecognizer.cancelsTouchesInView = NO;
    [self.tableView addGestureRecognizer:_tapGestureRecognizer];

添加關閉鍵盤方法:

    - (void)dismissKeyboard {
        [_textField resignFirstResponder];
    }

添加一個手勢識別器回調(在RootTableViewController中):

//see: http://stackoverflow.com/questions/7195661/why-is-uigesturerecognizer-being-called-on-my-textfield-clear-button
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if([touch.view isKindOfClass:[UITextField class]] ||
       [touch.view isKindOfClass:[UIButton class]])
    {
        return NO;
    }
    return YES;
}

當然,這意味着您必須使RootTableViewController遵守UIGestureRecognizerDelegate協議(在頭文件中):

@interface RootTableViewController : UITableViewController<SATextFieldDelegate, UIGestureRecognizerDelegate>

如果希望用戶滾動表視圖並關閉鍵盤,請執行以下表視圖委托回調:

- (void)scrollViewWillBeginDragging:(UIScrollView *)activeScrollView {
    if (_textField.isFirstResponder) {
        [self dismissKeyboard];
    }
}

我相信這是您想要的功能。

 -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
      if (_textField.isFirstResponder) {
         [self dismissKeyboard];
      }
  }

嘗試這個:

1)實現UIGestureRecognizerDelegate協議

2)以viewDidLoad為例,創建以下內容

    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
                                   initWithTarget:self
                                   action:@selector(hideKeyboard:)];

    tap.delegate = self;
    [self.view addGestureRecognizer:tap];

3)現在,從1開始從協議實施方法

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    // Use this for allow some control to receive his natural tap event. You can use tap.cancelsTouchesInView = NO; in the 2 step instead of this, try both of then and choose on your own.
    if (touch.view == <some control>) {
        //NSLog(@"NO");
        return NO;
    }
    //NSLog(@"YES");

    return YES;
}

4)最后,實現tap的回調

-(void) hideKeyboard:(id)sender{

    if (<your edit text>.isEditing) {
        [<your edit text> resignFirstResponder];
    }
}

我希望這會有所幫助,或者至少會為您指明正確的方向

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM