Как отменить выбор выбранной ячейки UITableView? - PullRequest
199 голосов
/ 19 октября 2010

Я работаю над проектом, в котором мне нужно предварительно выбрать конкретную ячейку.

Я могу предварительно выбрать ячейку, используя -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];
}

Вы можете помочь?

Ответы [ 23 ]

6 голосов
/ 19 октября 2010

Это должно работать:

[tableView deselectRowAtIndexPath:indexpath1 animated:NO];

Просто убедитесь, что materialTable и tableView указывают на один и тот же объект.

Подключены ли материалы к tableView в Интерфейсном Разработчике?

5 голосов
/ 31 октября 2017

Swift 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
    }
}
4 голосов
/ 17 февраля 2016

Swift 2.0:

tableView.deselectRowAtIndexPath(indexPath, animated: true)
3 голосов
/ 25 февраля 2013

попробуйте

[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
3 голосов
/ 01 июля 2015

Можете ли вы попробовать это?

- (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];
    }
}

Это сработало для меня.

3 голосов
/ 17 ноября 2014
NSIndexPath * index = [self.menuTableView indexPathForSelectedRow];
[self.menuTableView deselectRowAtIndexPath:index animated:NO];

поместите этот код в соответствии с вашим кодом, и вы отключите выбор ячейки.

2 голосов
/ 06 октября 2016

Swift 3.0:

В соответствии с разделом о соответствии протокола руководства по стилю Ray wenderlich Swift , чтобы объединить связанные методы, поместите это расширение под свой видкласс контроллера такой:

// your view controller
class MyViewcontroller: UIViewController {
  // class stuff here
}

// MARK: - UITableViewDelegate
extension MyViewcontroller: UITableViewDelegate {
      // use the UITableViewDelegate method tableView(_:didSelectRowAt:)
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        // your code when user select row at indexPath

        // at the end use deselectRow
        tableView.deselectRow(at: indexPath, animated: true)
    }
}
1 голос
/ 28 сентября 2017

Swift 3/4

В ViewController:

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

В пользовательской ячейке:

override func awakeFromNib() {
    super.awakeFromNib()
    selectionStyle = .none
}
1 голос
/ 09 апреля 2017

Свифт 3

Я тоже сталкивался с этим - когда вы переходите или возвращаетесь к табличному представлению, он обычно не отменяет ранее выбранную для вас строку. Я поместил этот код в контроллер табличного представления, и он хорошо работает:

override func viewDidAppear(_ animated: Bool) {
    if let lastSelectedRow = tableView.indexPathForSelectedRow {
        tableView.deselectRow(at: lastSelectedRow, animated: true)
    }
}
1 голос
/ 08 апреля 2017
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...