8

我定義這個方法在我的UITableViewController子類:倒是開始的UITableViewController

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [super touchesBegan:touches withEvent:event]; 
    NSLog(@"touch began"); 
} 

,但它沒有被觸發。 UIViewController是UIResponder的一個子類,所以它應該工作,對吧? 謝謝

回答

4

是的,這應該肯定工作。

確保將用戶交互啓用設置爲與此控制器對應的視圖。

如果視圖是從nib/xib加載的,請確保File's Owner被設置爲適當的類名稱,並且File's Owner的view outlet連接到正確的視圖。

更新:我也看到了這種行爲,使用基於導航的應用程序模板構建的應用程序,但使用基於視圖的應用程序模板,它可以按預期工作。

我認爲,在導航控制器的情況下,視圖控制器中嵌入的表視圖在視圖控制器執行前獲取事件。參見UIView reference(重點煤礦):

視圖控制器本身的UIResponder類 的 後代,並插入響應 鏈的管理根視圖 和它的父,其通常 屬於不同的間查看 控制器。 如果視圖控制器的視圖沒有處理事件,視圖控制器本身具有處理事件的選項 ,然後將該事件傳遞給超級視圖。

這意味着視圖有第一次處理事件的機會,如果是這樣,視圖控制器將不會得到它。

不完全清楚你想要完成什麼,所以我不確定提供什麼解決方案。

+0

嘿,感謝您的回覆。我做了一個新的XCode導航項目,並在UITableViewController子類中添加了touchesbegan方法(沒有改變其他任何東西),但它不起作用 – sumderungHAY 2011-06-09 01:03:01

+0

是的,我也看到了這種行爲 - 更新了我的答案。 – zpasternack 2011-06-09 04:52:45

+1

感謝您的詳細解答。基本上,我有一個UIKeyboardTypeNumber類型的UITextField,我想在用戶點擊屏幕上的任何地方時退出第一響應者(關閉鍵盤)。 – sumderungHAY 2011-06-09 06:24:44

3

我剛剛遇到了與原始發佈完全相同的問題。我通過創建UITableView的子類並覆蓋「touchesBegan」方法來解決這個問題。我還創建了一個協議,以便UITableView可以在UITableViewController上調用一個方法,這最終是我想要處理「touchesBegan」事件的地方。

下面是UITableView的亞型頭:

@protocol AGSTableViewDelegate; 

@interface AGSTableView : UITableView 
@property (nonatomic, weak) id<AGSTableViewDelegate> agsDelegate; 
@end 

@protocol AGSTableViewDelegate<NSObject> 
-(void)tableViewTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; 
@end 

與實現

@implementation AGSTableView 

@synthesize agsDelegate; 

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{  
    [super touchesBegan:touches withEvent:event]; 

    if (agsDelegate) 
     [agsDelegate tableViewTouchesBegan:touches withEvent:event]; 
} 
@end 

最後,從UITableViewController中的代碼片段:

@interface AGSWasteUpdateTableController()<AGSTableViewDelegate> 
@end 

- (void)viewDidLoad 
{ 
    AGSTableView *tableView = (AGSTableView *)[self tableView]; 
    tableView.agsDelegate = self; 
} 

-(void)tableViewTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [yourTextField resignFirstResponder]; 
} 

希望這有助於.. 。

5

如果您嘗試解除UITableViewController中的鍵盤,一個體面的解決方案是在tableView委託的didSelectRowAtIndexPath方法中調用resignFirstResponder。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [myTextField resignFirstResponder]; 

    // Rest of your actual didSelectRowAtIndexPath code ... 
} 
+0

嘿,我有一個類似的問題。從接受的答案中的上述評論中可以明顯看出@sumderungHAY沒有解決他的問題,但它仍然被接受! 但您的解決方案適合我! – 2012-08-02 08:21:35

1

您需要將響應傳遞給響應者鏈。我們可以通過繼承UITableView並覆蓋touchesBegan(以及其他需要的),然後將響應者鏈接傳遞給UITableViewController來實現。

UITableViewTouch.h:

#import <UIKit/UIKit.h> 

@interface UITableViewTouch : UITableView 

@end 

UITableViewTouch.m:

#import "UITableViewTouch.h" 

@implementation UITableViewTouch 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [super touchesBegan:touches withEvent:event]; 
    [[self nextResponder] touchesBegan:touches withEvent:event]; 
} 

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { 
    [super touchesCancelled:touches withEvent:event]; 
    [[self nextResponder] touchesCancelled:touches withEvent:event]; 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    [super touchesEnded:touches withEvent:event]; 
    [[self nextResponder] touchesEnded:touches withEvent:event]; 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    [super touchesMoved:touches withEvent:event]; 
    [[self nextResponder] touchesMoved:touches withEvent:event]; 
} 

@end 
1

斯威夫特的版本,因爲我不得不就此問題:

import UIKit 

class BubbleTouchesTableView: UITableView { 

    // Designed to bubble up touches from a UITableView 

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 
     super.touchesBegan(touches, withEvent: event) 
     self.nextResponder()?.touchesBegan(touches, withEvent: event) 
    } 

    override func touchesCancelled(touches: NSSet, withEvent event: UIEvent) { 
     super.touchesCancelled(touches, withEvent: event) 
     self.nextResponder()?.touchesCancelled(touches, withEvent: event) 
    } 

    override func touchesEnded(touches: NSSet, withEvent event: UIEvent) { 
     super.touchesEnded(touches, withEvent: event) 
     self.nextResponder()?.touchesEnded(touches, withEvent: event) 
    } 

    override func touchesMoved(touches: NSSet, withEvent event: UIEvent) { 
     super.touchesMoved(touches, withEvent: event) 
     self.nextResponder()?.touchesMoved(touches, withEvent: event) 
    } 

} 
相關問題