2013-05-07 21 views
0

我有一個自定義的UITableViewCell,裏面有一個文本字段。我已經使用IB創建了它,併爲它定製了一個類。如何使用文本字段處理UItableViewCell的事件(Touch Up Inside/Outside)?

現在,我的問題是,我想設置文本字段,以便在文本輸入過程中,如果用戶在文本字段外單擊(沒有按下鍵盤上的返回/完成鍵),該字段將辭退第一響應者。我明白,那是否需要處理Touch Up Inside Event。然而,即使我已經完成了連接,我的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]; 

} 

回答

1

我最近剛剛開源a project on 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; 
} 

當然,th是意味着你必須做出RootTableViewController堅持UIGestureRecognizerDelegate協議(在頭文件):

@interface RootTableViewController : UITableViewController<SATextFieldDelegate, UIGestureRecognizerDelegate> 

如果你希望用戶滾動表視圖,並取消鍵盤實現如下表視圖委託回調:

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

非常感謝!代碼完美工作。僅供參考閱讀另一段代碼。意識到我不必保留指向文本字段的指針來關閉鍵盤。只需在「dismissKeyboard」方法中執行「[self.tableView endEditing:NO]」就可以了! – iansari 2013-05-08 19:23:22

+0

好極了!很高興聽到!如果我的答案解決了您的問題,請將其標記爲答案標記在向上/向下箭頭的左側) – Stunner 2013-05-08 20:13:28

0

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

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

嘗試這種情況:

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)最後,實現回調的自來水

-(void) hideKeyboard:(id)sender{ 

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

我希望這會有所幫助,或者至少你點到正確的方向

+0

謝謝!很好的指導! – iansari 2013-05-08 19:24:31

+0

你很好,我希望這些說明對你有幫助xD – 2013-05-09 07:46:06

相關問題