Подтвердить что ты не робот

UITableView didSelectRowAtIndexPath не вызывается при первом нажатии

У меня проблема с UITableView didSelectRowAtIndexPath из 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);
}
4b9b3361

Ответ 1

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

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

РЕШЕНИЕ: didSelectRowAtIndexPath

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

ПОЛНЫЙ КОД:

// right
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {}

Ответ 2

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

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    [self.tableView reloadData];
}

Ответ 3

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

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

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

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

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

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

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

Ответ 4

Подключите делегат от Xib к владельцам файлов. Затем попробуйте, чтобы он работал.

Ответ 5

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

[self.tableView reloadData]

Ответ 6

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

Ответ 7

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

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

        performSegue(withIdentifier: "Detail", sender: self)
}