我有一個UITableViewCell
被點擊時選擇。在此選定狀態期間,如果用戶再次點擊該單元格,我希望該單元格取消選擇。UITableView點擊以取消選擇單元
我找不到任何正在命中的委託電話。任何想法如何實現這一點?它真的會成爲一個手勢識別器嗎?
我有一個UITableViewCell
被點擊時選擇。在此選定狀態期間,如果用戶再次點擊該單元格,我希望該單元格取消選擇。UITableView點擊以取消選擇單元
我找不到任何正在命中的委託電話。任何想法如何實現這一點?它真的會成爲一個手勢識別器嗎?
也許我的問題不夠具體,但兩個答案都有點寬的我是什麼了。
看來這是不可能的,我用單元的手勢識別器去手動設置選定/未選中狀態。
當您選擇一個單元格時,會觸發此委託方法。
- (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
}
}
這是僞代碼。
我認爲使用藍色選擇顏色切換可能會給人一種奇怪的印象。爲什麼不使用像複選標記的配件?這是一個更爲熟悉的選擇切換技術(無論是多單元還是單單元)。
看到這個答案的信息: UITableView Multiple Selection
你可以試試這個,這對我的作品(單一選擇或多項選擇):
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;
}
這將導致的錯誤,如果你不處理的細胞正確 –
實際上,你可以做到這一點使用委託方法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:
不會自動調用委託方法,因此您需要手動進行這些調用。
注意的離隊,您應經常檢查,如果委託調用它的方法之前,響應一個選擇。 – Patrick
這裏是一個更好的解決方法:
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([[tableView indexPathForSelectedRow] isEqual:indexPath]) {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
return nil;
}
return indexPath;
}
不要使用==來比較對象。這應該是如果([的tableView indexPathForSelectedRow] isEqual:方法indexPath]){ – ahwulf
我是同樣的事情,但@occulus後answer提供我,我錯過了提示。
它讓我意識到完成這項工作的方法是允許在表視圖中進行多項選擇,並在使用其中一種委託方法選擇新行時手動取消選擇之前選定的行。
在單一選擇模式下,表格視圖試圖儘可能保留選中的一行,這樣看起來很自然,因此不會在選中的行上取消選擇。
- (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;
}
:
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
}
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;
}
當使用 「多選」 模式, 「didSelectRowAtIndexPath方法」 不會當你點擊一個名爲已被選中的行。仍然可以在「單選」模式下以編程方式選擇多行,並且行將在所有點擊中觸發didSelectRowAtIndexPath。
剛擡起頭,以誰也有同樣問題的人。
從@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
}
我得到以下錯誤:'懸而未決標識的使用 '的tableView(_:willDeselectRowAt :)''。使用XCode9.1和Swift3 – elysch
你到底想幹什麼?我的代碼使您能夠跟蹤之前選擇的單元格。裏面,如果你可以實現更多你想要的東西。 – JHHoang
如果單元格已被選中,則此方法從不稱爲 –
這很容易。你有多少個細胞?我可以通過使用UItableview委託給你寫一個示例代碼。讓我知道你是否仍然感興趣。 – JHHoang