自定义 UITableViewCell 不调用 prepareForSegue

Posted

技术标签:

【中文标题】自定义 UITableViewCell 不调用 prepareForSegue【英文标题】:Custom UITableViewCell not calling prepareForSegue 【发布时间】:2012-08-11 15:09:25 【问题描述】:

我有一个自定义 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 吗?如果是这样,我应该在哪里做。

【问题讨论】:

你的tableView:didSelectRowAtIndexPath:呢? 我没有那个方法,需要实现吗? 根据我的阅读,我们不使用prepareForSegue 代替didSelectRowAtIndexPath 吗? 【参考方案1】:

你需要实现

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



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



【讨论】:

请注意,didSelectRowAtIndexPath: 和 prepareForSegue: 都是 UIViewController 的方法,而不是 UITableViewCell 的方法【参考方案2】:

您不应该必须实现 didSelectRow 以使其工作 - 从一个单元格拖动到另一个视图控制器的控制应该创建一个在点击单元格时工作的 segue。

就我而言,问题在于情节提要编辑器错误地创建了转场。我有两个非常相似的故事板,一个有效,另一个没有,并查看源代码(右键单击故事板文件并选择 Open As -> Source Code),我看到了这个:

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

注意trigger 属性。这向我表明,segue 将从单元的辅助动作中触发。您甚至可以从单元的连接检查器中看到这一点:

通过从上面的“选择”句柄拖动而不是从单元格中拖动控件来删除它并替换segue,这给了我正确的segue。

我不确定这个特定的单元格是什么让控制拖动连接到辅助操作而不是选择操作,但是你去吧。

【讨论】:

感谢您的建议,我遇到了同样的问题!! :)【参考方案3】:

如上所述,您需要使用didSelectRowAtIndexPath,除非您在情节提要中将segue 配置为新的UIViewController。这允许您使用prepareForSegue 函数而不是performSegueWithIdentifier 的编程调用。

希望这有助于清除它!

【讨论】:

我不认为didSelectRowAtIndex 是一个函数。如果不正确,请检查您的答案和正确的函数名称。 看起来我错过了最后的路径。谢谢!【参考方案4】:

我的问题是单元格标识符。

所以,我在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 中声明了static NSString *cellIdentifier = @"cell";,然后在storyBoard 中我在这里添加了这个标识符:

给你!

【讨论】:

以上是关于自定义 UITableViewCell 不调用 prepareForSegue的主要内容,如果未能解决你的问题,请参考以下文章

调用 reloadData 时自定义 UITableViewCell 内存泄漏

未从自定义 uitableviewcell 调用 prepareForSegue

自定义 UITableViewCell 高度会产生不正确的动画

多次调用自定义 UITableViewCell initWithStyle

Objective-C:在不可见的自定义 UITableViewCell 上获取属性的值

如何从自定义 UITableViewCell 调用操作以重新加载 tableView