UITableView didSelectRowAtIndexPath не вызывается при первом нажатии - PullRequest
27 голосов
/ 01 февраля 2012

У меня проблема с didSelectRowAtIndexPath из UITableView для ios 5, что правильно в ios 4.

При первом нажатии любой строки в таблице метод не вызывается. Как только я выбираю другую строку, она вызывает didSelectRowAtIndexPath, но передает последний indexPath.

Я уже установил tableView.delegate, и он может корректно работать в ios4.

MainView.xib
UITabBarController
     --UINavigationController
         --**UITableViewController**

Есть предложения?

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 10;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }
    cell.textLabel.text = [[NSString alloc]initWithFormat:@"%d",indexPath.row];
    return cell;
}

#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"%d",indexPath.row);
}

Ответы [ 7 ]

34 голосов
/ 02 ноября 2013

Возможно, вы внедрили (обратите внимание на Отмените выбор ): didDeselectRowAtIndexPath

... отсюда триггер при выборе новой ячейки, которая отменяет выбор первой ячейки, и запись indexPath в качестве первой.

РЕШЕНИЕ: didSelectRowAtIndexPath

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

ПОЛНЫЙ КОД:

// right
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {}
1 голос
/ 16 сентября 2013

Я не уверен, что на этот вопрос был дан ответ, но я работал с этой проблемой и точно так же, как "Анна Каренина" прокомментировала выше. Убедитесь, что вы уделяете пристальное внимание деталям.

Это вызвано тем, что вы внедрили DEselect

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

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

Решение : убедитесь, что вы обратили внимание и используете didSelectRowAtIndexPath

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

надеюсь, что это помогает и, как я уже упоминал, до того, как это было решено "Анной Карениной"

1 голос
/ 25 января 2013

Пожалуйста, попробуйте изменить -viewDidLoad на приведенный ниже код (вставьте последнюю строку).Расскажите мне о результатах.

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    [self.tableView reloadData];
}
0 голосов
/ 01 ноября 2016

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

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        selectedData = data[indexPath.row]

        performSegue(withIdentifier: "Detail", sender: self)
}
0 голосов
/ 02 мая 2016

У меня был UIGestureRecognizer в представлении внутри раскадровки.Я должен был удалить его, и он работал как обычно.

0 голосов
/ 18 февраля 2013

Добавьте этот код в viewDidLoad метод

[self.tableView reloadData]
0 голосов
/ 27 декабря 2012

Пожалуйста, подключите делегат от Xib к владельцам файлов. Тогда попробуй, это сработает.

...