Пользовательский UITableViewCell не вызывает prepareForSegue

У меня есть пользовательский UITableViewCell, называемый EventCell.

EventCell.h

#import <UIKit/UIKit.h>

@interface EventCell : UITableViewCell

@property (nonatomic, strong) IBOutlet UILabel *titleLabel;
@property (nonatomic, strong) IBOutlet UILabel *locationLabel;
@property (nonatomic, strong) IBOutlet UILabel *dateLabel;
@property (nonatomic, strong) IBOutlet UILabel *typeLabel;
@end

EventCell.m

#import "EventCell.h"

@implementation EventCell

@synthesize titleLabel, locationLabel, dateLabel, typeLabel;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
    }
    return self;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}

@end

Вот как я настраиваю свою камеру.

EventsMasterViewController.m

- (EventCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    Event *myEvent;
    NSString *CellIdentifier = @"EventCell";
    EventCell *cell = (EventCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];


    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"EventCell" owner:nil options:nil];

    for (id currentObject in topLevelObjects)
    {
        if ([currentObject isKindOfClass:[EventCell class]])
        {
            cell = (EventCell *)currentObject;
            break;
         }
    }

    myEvent = [self.myEventsDataController objectInListAtIndex:indexPath.row];

    cell.titleLabel.text = myEvent.name;
    cell.locationLabel.text = myEvent.location;
    cell.typeLabel.text = @"Social";
    cell.layer.borderColor = [UIColor blackColor].CGColor;
    cell.layer.borderWidth = 1.0;

    return cell;
}

Ячейка отлично форматируется, выглядит именно так, как мне нужно. Но когда я нажимаю на нее, ячейка выделяется синим цветом и не переходит к следующему представлению. Я поставил точку останова в методе prepareForSegue, но он даже не вызывается.

Есть ли способ вызвать prepareForSegue вручную? Если да, то где мне это сделать.


person ardavis    schedule 11.08.2012    source источник
comment
А как насчет вашего tableView:didSelectRowAtIndexPath:?   -  person Desdenova    schedule 11.08.2012
comment
У меня нет метода с таким названием, нужно ли мне это реализовывать?   -  person ardavis    schedule 11.08.2012
comment
Из того, что я читаю, разве мы не используем prepareForSegue вместо didSelectRowAtIndexPath?   -  person ardavis    schedule 11.08.2012


Ответы (4)


Вам необходимо реализовать

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



[self performSegueWithIdentifier:@"YourSegueIdentifier" sender:nil];


}
person Desdenova    schedule 11.08.2012
comment
обратите внимание, что и didSelectRowAtIndexPath:, и prepareForSegue: являются методами UIViewController, а не UITableViewCell. - person Brabbeldas; 26.02.2014

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

В моем случае проблема заключалась в том, что редактор раскадровки неправильно создавал переход. У меня было две очень похожие раскадровки, одна работала, а другая нет, и глядя на исходный код (щелкните правой кнопкой мыши файл раскадровки и выберите Открыть как -> Исходный код), я видел это:

<segue destination="UWX-rF-KOc" kind="replace" identifier="showStory" trigger="accessoryAction" splitViewControllerTargetIndex="1" id="Gly-La-KIe"/>

Обратите внимание на атрибут trigger. Это наводит меня на мысль, что переход будет вызван дополнительным действием клетки. Это можно увидеть даже в инспекторе соединений ячейки:

введите здесь описание изображения

Удаление этого и замена перехода путем перетаскивания из дескриптора «выбора» выше вместо перетаскивания элемента управления из ячейки дали мне правильный переход.

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

person jrturton    schedule 16.12.2014
comment
спасибо за предложение, у меня была такая же проблема!! :) - person Pangu; 22.01.2015

Как указано выше, вам нужно использовать didSelectRowAtIndexPath, если только вы не настроите переход в своей раскадровке на новый UIViewController. Это позволяет использовать функцию prepareForSegue вместо программного вызова performSegueWithIdentifier.

Надеюсь, это поможет разобраться!

person heckman    schedule 11.08.2012
comment
Я не думаю, что didSelectRowAtIndex это функция. Пожалуйста, проверьте свой ответ и исправьте имя функции, если оно неверно. - person Donovan; 12.06.2013
comment
Похоже, я пропустил путь в конце. Спасибо! - person heckman; 26.10.2013

Моя проблема заключалась в идентификаторе ячейки.

Итак, в - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath я объявил static NSString *cellIdentifier = @"cell";, а затем в StoryBoard я добавил этот идентификатор здесь:

введите здесь описание изображения

И вот!

person Gal    schedule 05.10.2014