2012-10-02 124 views
15

我有一個UITableViewCell被點擊時選擇。在此選定狀態期間,如果用戶再次點擊該單元格,我希望該單元格取消選擇。UITableView點擊以取消選擇單元

我找不到任何正在命中的委託電話。任何想法如何實現這一點?它真的會成爲一個手勢識別器嗎?

回答

-4

也許我的問題不夠具體,但兩個答案都有點寬的我是什麼了。

看來這是不可能的,我用單元的手勢識別器去手動設置選定/未選中狀態。

+0

你到底想幹什麼?我的代碼使您能夠跟蹤之前選擇的單元格。裏面,如果你可以實現更多你想要的東西。 – JHHoang

+0

如果單元格已被選中,則此方法從不稱爲 –

+0

這很容易。你有多少個細胞?我可以通過使用UItableview委託給你寫一個示例代碼。讓我知道你是否仍然感興趣。 – JHHoang

2

當您選擇一個單元格時,會觸發此委託方法。

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 


     UITableViewCell *theUITableViewCell = [tableView cellForRowAtIndexPath:path]; 
     if (theUITableViewCell.selected == YES){ 
      self.tableView deselectRowAtIndexPath:<#(NSIndexPath *)#> animated:<#(BOOL)#> 
      // Do more thing 
     }else{ 
      // By default, it is highlighted for selected state 
     } 

} 

這是僞代碼。

3

我認爲使用藍色選擇顏色切換可能會給人一種奇怪的印象。爲什麼不使用像複選標記的配件?這是一個更爲熟悉的選擇切換技術(無論是多單元還是單單元)。

看到這個答案的信息: UITableView Multiple Selection

2

你可以試試這個,這對我的作品(單一選擇或多項選擇):

A.分配一個專用的NSMutableArray在viewDidLoad中,如:

@interface XXXViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> 
{ 
    NSMutableArray * selectedZoneCellIndexPaths; 
} 


- (void)viewDidLoad 
{ 
    selectedZoneCellIndexPaths = [[NSMutableArray alloc] init]; 
} 

B.中的UITableViewDelegate didSelectRow添加以下行

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    for (NSIndexPath * iter in selectedZoneCellIndexPaths) 
    { 
     if (indexPath.section == iter.section && indexPath.row == iter.row) 
     { 
      [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
      [selectedZoneCellIndexPaths removeObject:iter]; 
      return; 
     } 
    } 
    [selectedZoneCellIndexPaths addObject:indexPath]; 
    return; 
} 
+0

這將導致的錯誤,如果你不處理的細胞正確 –

30

實際上,你可以做到這一點使用委託方法willSelectRowAtIndexPath:

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    if ([cell isSelected]) { 
     // Deselect manually. 
     [tableView.delegate tableView:tableView willDeselectRowAtIndexPath:indexPath]; 
     [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
     [tableView.delegate tableView:tableView didDeselectRowAtIndexPath:indexPath]; 

     return nil; 
    } 

    return indexPath; 
} 

請注意,deselectRowAtIndexPath:不會自動調用委託方法,因此您需要手動進行這些調用。

+9

注意的離隊,您應經常檢查,如果委託調用它的方法之前,響應一個選擇。 – Patrick

4

這裏是一個更好的解決方法:

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if ([[tableView indexPathForSelectedRow] isEqual:indexPath]) { 
     [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
     return nil; 
    } 
    return indexPath; 
} 
+0

不要使用==來比較對象。這應該是如果([的tableView indexPathForSelectedRow] isEqual:方法indexPath]){ – ahwulf

0

我是同樣的事情,但@occulus後answer提供我,我錯過了提示。

它讓我意識到完成這項工作的方法是允許在表視圖中進行多項選擇,並在使用其中一種委託方法選擇新行時手動取消選擇之前選定的行。

在單一選擇模式下,表格視圖試圖儘可能保留選中的一行,這樣看起來很自然,因此不會在選中的行上取消選擇。

3
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    if ([cell isSelected]) { 
     // Deselect manually. 
     if ([tableView.delegate respondsToSelector:@selector(tableView:willDeselectRowAtIndexPath:)]) { 
      [tableView.delegate tableView:tableView willDeselectRowAtIndexPath:indexPath]; 
     } 
     [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
     if ([tableView.delegate respondsToSelector:@selector(tableView:didDeselectRowAtIndexPath:)]) { 
      [tableView.delegate tableView:tableView didDeselectRowAtIndexPath:indexPath]; 
     } 
     return nil; 
    } 

    return indexPath; 
} 
7
斯威夫特4

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? { 

    if let indexPathForSelectedRow = tableView.indexPathForSelectedRow, 
     indexPathForSelectedRow == indexPath { 
     tableView.deselectRow(at: indexPath, animated: false) 
     return nil 
    } 
    return indexPath 
} 
1

prisonerjohn的回答斯威夫特版本:

public func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? { 
    let cell = tableView.cellForRowAtIndexPath(indexPath) 
    if (cell?.selected ?? false) { 
    // Deselect manually. 
    tableView.delegate!.tableView?(tableView, willDeselectRowAtIndexPath: indexPath) 
    tableView.deselectRowAtIndexPath(indexPath, animated: true) 
    tableView.delegate!.tableView?(tableView, didDeselectRowAtIndexPath: indexPath) 
    return nil 
    } 
return indexPath; 
} 
2

當使用 「多選」 模式, 「didSelectRowAtIndexPath方法」 不會當你點擊一個名爲已被選中的行。仍然可以在「單選」模式下以編程方式選擇多行,並且行將在所有點擊中觸發didSelectRowAtIndexPath。

剛擡起頭,以誰也有同樣問題的人。

1

從@prisonerjohn,萬一有人想知道如何檢查委託響應選擇爲@Patrick說,在斯威夫特3

override func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? { 
    guard let cell = tableView.cellForRow(at: indexPath) else { 
     // Handle invalid cell 
     ... 
    } 

    if cell.isSelected { 
     if let respond = tableView.delegate?.responds(
      to: #selector(tableView(_:willDeselectRowAt:))), 
      respond == true { 
      tableView.delegate?.tableView!(tableView, willDeselectRowAt: indexPath) 
     } 

     tableView.deselectRow(at: indexPath, animated: true) 

     if let respond = tableView.delegate?.responds(
      to: #selector(tableView(_:didDeselectRowAt:))), 
      respond == true { 
      tableView.delegate?.tableView!(tableView, didDeselectRowAt: indexPath) 
     } 

     return nil 
    } 

    return indexPath 
} 
+0

我得到以下錯誤:'懸而未決標識的使用 '的tableView(_:willDeselectRowAt :)''。使用XCode9.1和Swift3 – elysch

相關問題