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

时间:2010-10-19 11:56:09

标签: ios objective-c iphone uitableview interface-builder

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

我可以使用-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];
}

你能帮忙吗?

24 个答案:

答案 0 :(得分:391)

使用此代码

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

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)
}

答案 1 :(得分:116)

在表格视图委托didSelectRowAtIndexpath(或从任何地方)

中使用以下方法
[myTable deselectRowAtIndexPath:[myTable indexPathForSelectedRow] animated:YES];

答案 2 :(得分:37)

试试这个:

for (NSIndexPath *indexPath in tableView.indexPathsForSelectedRows) {
    [tableView deselectRowAtIndexPath:indexPath animated:NO];
}

答案 3 :(得分:28)

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

-(void) tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath

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

答案 4 :(得分:23)

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

Swift 4:

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

import UIKit

extension UITableView {

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

}

使用例如:

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

    self.tableView.deselectSelectedRow(animated: true)
}

答案 5 :(得分:22)

斯威夫特4:

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

答案 6 :(得分:11)

除了将单元格设置为选中之外,还需要通知tableView已选择单元格。在[{1}}方法中添加对-tableView:selectRowAtIndexPath:animated:scrollPosition:的通话:您可以正常取消选择。

willDisplayCell:

请务必使用UITableViewScrollPositionNone来避免奇怪的滚动行为。

答案 7 :(得分:7)

这是Swift 4的解决方案

 in tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)

只需添加

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

它就像一个魅力

示例:

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

答案 8 :(得分:6)

这应该有效:

[tableView deselectRowAtIndexPath:indexpath1 animated:NO];

确保materialTable和tableView指向同一个对象。

材质是否在Interface Builder中连接到tableView?

答案 9 :(得分: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];

}

在头文件中:

@property (retain, nonatomic) NSIndexPath* selectedRowIndex;

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

答案 10 :(得分: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;
    }
}

答案 11 :(得分:5)

斯威夫特4:

Sub PerhapsADate()
    Dim s As String, MonthAsNumber As Long
    Dim MonthAsString As String

    s = Range("B9").Text

    MonthAsNumber = --Split(s, "/")(0)
    MonthAsString = Format(CDate(s), "mmmm")

    MsgBox MonthAsNumber & vbCrLf & MonthAsString
End Sub

答案 12 :(得分:4)

Swift 2.0:

tableView.deselectRowAtIndexPath(indexPath, animated: true)

答案 13 :(得分:3)

NSIndexPath * index = [self.menuTableView indexPathForSelectedRow];
[self.menuTableView deselectRowAtIndexPath:index animated:NO];

根据您的代码放置此代码,您将取消选择您的单元格。

答案 14 :(得分:3)

你能试试吗?

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

    AppDelegate_iPad *appDelegte = 
    (AppDelegate_iPad *)[[UIApplication sharedApplication] delegate];
    NSIndexPath *indexpath1 = appDelegte.indexPathDelegate;
    appDelegte.indexPathDelegate = indexPath;

    UITableViewCell *prevSelectedCell = [tableView cellForRowAtIndexPath: indexpath1];
    if([prevSelectedCell isSelected]){
       [prevSelectedCell setSelected:NO];
    }
}

它对我有用。

答案 15 :(得分:3)

试试这个

[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];

答案 16 :(得分:2)

Swift 3.0:

protocol conformance section of the ray wenderlich swift style guide之后,为了将相关方法组合在一起,请将此扩展名放在您的视图控制器类下面:

cities['white plains'] = {'white plains'}
cities['white plains'] = {'country': 'united states'}
cities['white plains'] = {'population':'60 thousand'}
cities['white plains'] = {'attraction': 'kensico dam'}

答案 17 :(得分:1)

斯威夫特

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    // your code

    // your code

    // and use deselect row to end line of this function

    self.tableView.deselectRowAtIndexPath(indexPath, animated: true)

}

答案 18 :(得分:1)

Swift 3/4

在ViewController中:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
}

在自定义单元格中:

override func awakeFromNib() {
    super.awakeFromNib()
    selectionStyle = .none
}

答案 19 :(得分:1)

Swift 3

我也遇到过这种情况 - 当您导航或展开回到表格视图时,它通常不会取消选择之前选择的行。我把这个代码放在表视图控制器&效果很好:

override func viewDidAppear(_ animated: Bool) {
    if let lastSelectedRow = tableView.indexPathForSelectedRow {
        tableView.deselectRow(at: lastSelectedRow, animated: true)
    }
}

答案 20 :(得分:1)

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
}

答案 21 :(得分:0)

由于预加载的数据,第一次点击时取消选择(DidDeselectRowAt);您需要通知tableView已经选择了该行,以便初始点击然后取消选择该行:

// Swift 3:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    if tableView[indexPath.row] == "data value"

        tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableViewScrollPosition.none)

    }
}

答案 22 :(得分:0)

swift 3.0

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

答案 23 :(得分:0)

我发现的是,除了将单元格设置为 selected 之外,还必须让表视图知道 select 给定索引路径的行

// Swift 3+  

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if appDelegate.indexPathDelegate.row == indexPath.row {
        self.tableView.selectRow(at: indexPath, animated: true, scrollPosition: .none)
        cell.setSelected(true, animated: true)
    }
}