Метод didSelecctRowAtIndexPath выглядит следующим образом:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    self.currSelectedRowTitle = [[self.effectsTableView cellForRowAtIndexPath:indexPath].textLabel text];
    [self performSegueWithIdentifier:@"PushedByTableView" sender:self];
}

А cellForRowAtIndexPath выглядит следующим образом:

    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (!self.effectsArray)
    {
        [self loadEffectsInArray];
    }

    static NSString *cellIdentifier = @"EffectsCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
    }

    //6
    Effect *effectCellEffect = [self.effectsArray objectAtIndex:indexPath.row];
    NSString *effectCellText = effectCellEffect.name;
    //7
    [cell.textLabel setText:effectCellText];
    //[cell.detailTextLabel setText:@"5 stars!"];
    cell.textLabel.font = [UIFont systemFontOfSize:[UIFont labelFontSize]];
    //cell.backgroundColor = [UIColor blackColor];
    //cell.textLabel.textColor = [UIColor whiteColor];
    //cell.detailTextLabel.textColor = [UIColor grayColor];
    //cell.textLabel.highlightedTextColor = self.effectsTableView.tintColor;

    return cell;
}

Проблема в том, что [[self.effectsTableView cellForRowAtIndexPath: indexPath] .textLabel text] возвращает ноль на didSelectRowAtIndexPath. В чем проблема?

0
Aviral Bajpai 7 Апр 2014 в 11:32
Вы никогда не должны использовать представления как способ хранения данных. У OP уже есть массив всех строк, которые он использует в cellForRow, поэтому он должен делать то же самое в didSelect.
 – 
Fogmeister
7 Апр 2014 в 11:37

2 ответа

Лучший ответ

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

В вашем коде вы делаете ...

Effect *effectCellEffect = [self.effectsArray objectAtIndex:indexPath.row];
NSString *effectCellText = effectCellEffect.name;

cell.textLabel.text = effectCellText;

Так что в didSelectRow сделайте то же самое ...

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    Effect *effectCellEffect = [self.effectsArray objectAtIndex:indexPath.row];
    self.currSelectedRowTitle = effectCellEffect.name;
    [self performSegueWithIdentifier:@"PushedByTableView" sender:self];
}

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

1
Fogmeister 7 Апр 2014 в 11:35
1
Вау... мило... почему я не подумал об этом!
 – 
Aviral Bajpai
7 Апр 2014 в 11:43
Не беспокойтесь, иногда, если вы слишком долго работали над своим проектом, вы начинаете упускать из виду более простые вещи :D
 – 
Fogmeister
7 Апр 2014 в 11:46
Итак, это, очевидно, работает, но, серьезно, что не так с попыткой получить заголовок выбранной ячейки?... Я не понимаю, почему это не работает.
 – 
Aviral Bajpai
7 Апр 2014 в 11:49
Хм... не уверен, почему это не работает в этом конкретном случае. Однако, когда вы запускаете это, он не просто возвращает уже созданную ячейку. Он удаляет из очереди дополнительную ячейку, содержащую те же данные. Это занимает дополнительную память там, где она не нужна. Например. если у вас есть 10 строк на экране, вам нужно будет поставить в очередь только 10 ячеек. Это создаст 11. Кроме того, как правило, использование представлений в качестве хранилищ данных является плохой практикой. В шаблоне MVC вы используете часть V для выполнения M-материала. M = массив эффектов. С = контроллер. В = ячейка. Вы не должны смешивать их.
 – 
Fogmeister
7 Апр 2014 в 11:53
Хмммм... ок понял. Спасибо брат :)
 – 
Aviral Bajpai
7 Апр 2014 в 11:59
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableviewCell *cell=(UITableviewCell *)[self.effectsTableView cellForRowAtIndexPath:indexPath];
    self.currSelectedRowTitle = [cell.textLabel text];
    [self performSegueWithIdentifier:@"PushedByTableView" sender:self];
}

Это может сработать ...

0
Jay Gajjar 7 Апр 2014 в 11:34
Это может сработать, но вы никогда не должны использовать представления для хранения таких данных. В OP уже есть массив всех строк. Он должен использовать это, чтобы получить строку, а не метку в ячейке.
 – 
Fogmeister
7 Апр 2014 в 11:36