2010-05-14 39 views
0

我正在研究一個基於導航的iPhone應用程序,該應用程序有兩個主要用途:一,以分層視圖呈現數據,允許用戶深入並最終編輯所述數據,二,在所有用戶點擊表格視圖單元格時執行默認操作。我現在需要提供一組與相同數據綁定的選項;然而,顯然採用了didSelectRowAtIndexPath:和accessoryButtonTappedForRowAtIndexPath:方法。UITouch事件和表格視圖

所以,我的選擇似乎是實現一個雙抽頭方法,其中附加選項的小列表將出現在(你猜對了)在所述表格行上的雙擊;或者優選地是輕敲和保持方法。從我所知道的來看,點擊並保持似乎是SDK 4.0中的方式 - 這對我這個炙手可熱的時刻來說沒有好處。我決定採用雙擊選項,但我遇到了一些麻煩。

首先,touchesBegan:withEvent:方法似乎根本不會被調用;放在方法內的斷點不會被調用,而應用程序運行,並表視圖響應,正是因爲它做之前,我插入的方法(這是說,它執行的默認操作):

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *aTouch = [touches anyObject]; 
    if (aTouch.tapCount == 2) { 
     [NSObject cancelPreviousPerformRequestsWithTarget:self]; 
    } 
} 

其次,我並不需要處理單擊 - didSelectRowAtIndexPath:方法可以處理單擊即可。雙擊是我想要處理的時髦。我懷疑答案會包含這樣一句話:「你不能讓表視圖處理單擊,touchesBegan:方法處理雙擊,觸摸處理方法必須處理所有這些。」

我真的很感謝你們中的一些人處理過這個問題。提前致謝。

回答

2

好吧,經過了一個禮拜的頭部劃傷和低吟之後,我終於得出以下結論:儘管我想要做的事情在理論上可能使用當前版本的iPhone OS,但努力使其工作將成爲規模巨大的。鑑於iPhone OS 4將於近期推出,我選擇使用4.0 SDK功能來實現我期待的行爲。

具體地說,我做了什麼是這樣的:

// in my tableView:cellForRowAtIndexPath: method 
static NSString *CellIdentifier = @"CustomCell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
[[NSBundle mainBundle] loadNibNamed:@"TableViewCell" owner:self options:nil]; 
    cell = tvCell; 
    self.tvCell = nil; 
} 
UILabel *label; 
label = (UILabel*)[cell viewWithTag:1]; 
label.text = [NSString stringWithFormat:@"Main Label"]; 
label = (UILabel*)[cell viewWithTag:2]; 
label.text = [NSString stringWithFormat:@"Sub Label"]; 
UILongPressGestureRecognizer *recognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)]; 
[[cell viewWithTag:0] addGestureRecognizer:recognizer]; 
[recognizer release]; 
UIImage *theImage = [UIImage imageNamed:@"silhouette.png"]; 
UIImageView *pictureView = (UIImageView*)[cell viewWithTag:0]; 
pictureView.image = theImage; 
return cell; 

我創建的自定義單元格單獨的NIB文件;它只是一個tableViewCell對象,在最左邊有一個imageView(用於聯繫人的照片),中間有兩個標籤(主標籤有較大的文本,子標籤有較小的文本)。 cellForRowAtIndexPath:方法根據需要加載此自定義單元格,然後使用一些靜態數據填充單元格(當將此代碼合併到我的現有應用程序中時,顯然會更改它)。我只需要實現對手勢識別一個新方法:

- (void)handleLongPress:(UILongPressGestureRecognizer*)sender { 
NSLog(@"Long press detected."); 
} 

顯然,這也將充實當我真正把它用。

整個交易就像一個魅力。點擊並按住單元格會觸發「長按檢測」日誌,並且常規單擊會觸發tableView:didSelectRowAtIndexPath:方法中類似的「短按檢測到」日誌。

希望這有助於某人。