如何取消选择所选的UITableView单元格?

Ram*_*Ram 206 iphone objective-c interface-builder uitableview ios

我正在开展一个项目,我必须预先选择一个特定的单元格.

我可以预先选择一个单元格-willDisplayCell,但是当用户点击任何其他单元格时我无法取消选择它.

- (void)tableView:(UITableView*)tableView 
        willDisplayCell:(UITableViewCell*)cell
        forRowAtIndexPath:(NSIndexPath*)indexPath
{ 
    AppDelegate_iPad *appDelegte = 
      (AppDelegate_iPad *)[[UIApplication sharedApplication] delegate];

    if ([appDelegte.indexPathDelegate row] == [indexPath row])
    {
        [cell setSelected:YES];    
    } 
}

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

    AppDelegate_iPad *appDelegte = 
      (AppDelegate_iPad *)[[UIApplication sharedApplication] delegate];

    NSIndexPath *indexpath1 = appDelegte.indexPathDelegate;
    appDelegte.indexPathDelegate = indexPath;
    [materialTable deselectRowAtIndexPath:indexpath1 animated:NO];
}
Run Code Online (Sandbox Code Playgroud)

你能帮我吗?

Sai*_*n K 398

使用此代码

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
 {
    //Change the selected background view of the cell.
     [tableView deselectRowAtIndexPath:indexPath animated:YES];
 }
Run Code Online (Sandbox Code Playgroud)

Swift 3.0:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    //Change the selected background view of the cell.
    tableView.deselectRow(at: indexPath, animated: true)
}
Run Code Online (Sandbox Code Playgroud)

  • 我已经使用过该代码,但它不起作用. (5认同)
  • 我不明白......这段代码永远不会让任何东西被选中. (4认同)
  • 我想我不能upvote这篇文章,因为它会导致整数溢出:) (3认同)

小智 116

在表视图委托中使用以下方法didSelectRowAtIndexpath(或从任何地方)

[myTable deselectRowAtIndexPath:[myTable indexPathForSelectedRow] animated:YES];
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,`indexPathForSelectedRow`是一个方法,而不是一个属性. (2认同)

小智 38

试试这个:

for (NSIndexPath *indexPath in tableView.indexPathsForSelectedRows) {
    [tableView deselectRowAtIndexPath:indexPath animated:NO];
}
Run Code Online (Sandbox Code Playgroud)


jfa*_*jay 28

请检查委托方法是否正确.例如;

-(void) tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
Run Code Online (Sandbox Code Playgroud)

对于

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
Run Code Online (Sandbox Code Playgroud)


Tho*_*oom 25

为此在Swift中进行扩展可能很有用.

斯威夫特4:

Swift扩展(例如在UITableViewExtension.swift文件中):

import UIKit

extension UITableView {

    func deselectSelectedRow(animated: Bool)
    {
        if let indexPathForSelectedRow = self.indexPathForSelectedRow
        {
            self.deselectRow(at: indexPathForSelectedRow, animated: animated)
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

使用例如:

override func viewWillAppear(_ animated: Bool)
{
    super.viewWillAppear(animated)

    self.tableView.deselectSelectedRow(animated: true)
}
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,这个答案更好,因为将荒凉放在 `viewWillAppear()` 方法中可以帮助用户了解他从哪里回来。 (2认同)

And*_*ndo 22

斯威夫特4:

tableView.deselectRow(at: indexPath, animated: true)
Run Code Online (Sandbox Code Playgroud)


tBu*_*Bug 12

这是Swift 4的解决方案

 in tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
Run Code Online (Sandbox Code Playgroud)

只需添加

tableView.deselectRow(at: indexPath, animated: true)
Run Code Online (Sandbox Code Playgroud)

它就像一个魅力

例:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
//some code
}
Run Code Online (Sandbox Code Playgroud)


Dre*_*w C 11

除了将单元格设置为选中之外,还需要通知tableView已选择单元格.添加-tableView:selectRowAtIndexPath:animated:scrollPosition:对您的willDisplayCell:方法的调用:您将能够正常取消选择它.

- (void)tableView:(UITableView*)tableView 
  willDisplayCell:(UITableViewCell*)cell
forRowAtIndexPath:(NSIndexPath*)indexPath
{ 
    AppDelegate_iPad *appDelegte = (AppDelegate_iPad *)[[UIApplication sharedApplication] delegate];

    if ([appDelegte.indexPathDelegate row] == [indexPath row])
    {
        // SELECT CELL
        [cell setSelected:YES]; 
        // TELL TABLEVIEW THAT ROW IS SELECTED
        [tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];   
    } 
}
Run Code Online (Sandbox Code Playgroud)

一定要使用UITableViewScrollPositionNone来避免奇怪的滚动行为.


Jor*_*dan 6

这应该工作:

[tableView deselectRowAtIndexPath:indexpath1 animated:NO];
Run Code Online (Sandbox Code Playgroud)

只需确保materialTable和tableView指向同一个对象.

材料是否连接到Interface Builder中的tableView?


Yun*_*hel 6

根据saikirans解决方案,我写了这个,这对我有帮助.在.m文件中:

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

    if(selectedRowIndex && indexPath.row == selectedRowIndex.row) {

        [tableView deselectRowAtIndexPath:indexPath animated:YES];
        selectedRowIndex = nil;

    }

    else {  self.selectedRowIndex = [indexPath retain];   }

    [tableView beginUpdates];
    [tableView endUpdates];

}
Run Code Online (Sandbox Code Playgroud)

并在头文件上:

@property (retain, nonatomic) NSIndexPath* selectedRowIndex;
Run Code Online (Sandbox Code Playgroud)

我也不是很有经验,所以要仔细检查内存泄漏等.


CHi*_*-NY 6

如果要在第一次单击时选择任何表格单元格,并在第二次单击时取消选择,则应使用以下代码:

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

    if (self.selectedIndexPath && 
        [indexPath compare:self.selectedIndexPath] == NSOrderedSame) {

        [tableView deselectRowAtIndexPath:indexPath animated:YES];
         self.selectedIndexPath = nil;
    } 
    else {
        self.selectedIndexPath = indexPath;
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

斯威夫特4:

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
    let cell = tableView.cellForRow(at: indexPath)
    if cell?.isSelected == true { // check if cell has been previously selected
        tableView.deselectRow(at: indexPath, animated: true)
        return nil
    } else {
        return indexPath
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这在 Swift 3 中对我有用。只需要在 `tableView.deselectRow...` 之后添加 `self.tableView(tableView, didDeselectRowAt: indexPath)` 因为它没有被自动调用 (2认同)