从tableView didSelectRowAtIndexPath执行segue时出现延迟/故障

时间:2014-11-10 22:21:37

标签: ios objective-c uiviewcontroller delay segue

UPDATE :看起来我的自定义单元格代码正在减慢速度,当我使用框架UITableViewCell时,执行segue时没有延迟。

这是自定义的tableview单元格(它绘制了一个像聊天气泡一样的背景):

@implementation SGEMessageCell

@synthesize defaultColor;
@synthesize backgroundView;
@synthesize backgroundRect;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // controls
        self.dateLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 0, 290, 30)];
        self.dateLabel.textColor = [UIColor lightGrayColor];
        self.dateLabel.font = [UIFont fontWithName:@".HelveticaNeueInterface-Regular" size:10.0f];

        self.descriptionLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 25, 300, 30)];
        self.descriptionLabel.textColor = [UIColor whiteColor];
        self.descriptionLabel.font = [UIFont fontWithName:@".HelveticaNeueInterface-Regular" size:14.0f];

        backgroundView = [self createBackgroundView:self.defaultColor];
        backgroundView.tag = @"backgroundTag";

        [self addSubview:backgroundView];
        [self addSubview:self.dateLabel];
        [self addSubview:self.descriptionLabel];

        [self setNeedsDisplay];
    }
    return self;
}

@end

这是其他两个事件和行动的超级类,这是一个事件:

@implementation SGEEventCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self.defaultColor = [UIColor colorWithRed:0.91 green:0.91 blue:0.91 alpha:1];
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    return self;
}

- (UIView *)createBackgroundView:(UIColor *)color
{
    CGRect background = CGRectMake(10, 25, self.frame.size.width - 60, 90);
    UIView *backgroundView = [[UIView alloc] initWithFrame:background];
    backgroundView.backgroundColor = color;
    [backgroundView.layer setCornerRadius:7.0f];
    [backgroundView.layer setMasksToBounds:YES];
    return backgroundView;
}

- (void)updateBackgroundViewColor:(UIColor *)color
{
    UIView *bg = [self viewWithTag:@"backgroundTag"];
    bg.backgroundColor = color;
}

@end

/ UPDATE

我的主视图控制器(表格视图)中有以下代码

- (void)tableView:(UITableView *)theTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self performSegueWithIdentifier:@"eventDetailsSegue" sender:self];
}

最初它确实有代码存储了所选单元格的索引,但我删除它以查看它是否会在执行segue时修复毛刺/延迟,但它仍然会发生。故障是你经常需要在一个单元格上触摸两次才能使segue第一次执行,从那时起间歇性触摸会导致延迟的segue过渡。

目标视图控制器正在使用FXForms,但我已经删除了它以尝试解决故障所以现在它是一个带有ui构建器链接的消除消息的空视图控制器。

@implementation SGEEventDetailsViewController

- (IBAction)dismiss:(id)sender
{
    [self.presentingViewController dismissViewControllerAnimated:YES
                                                      completion:NULL];
}

@end

谢谢!

1 个答案:

答案 0 :(得分:0)

为时已晚,但是也许我的回答会在将来对一些开发人员有所帮助,我在使用Swift 5.1和Xcode 11.1时遇到了相同的错误,该错误在我创建自定义单元并实现didSelectRowAt方法委托时出现,我可以修复问题所在:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        DispatchQueue.global(qos: .userInteractive).async {
            DispatchQueue.main.async {
                self.performSegue(withIdentifier: "mySegueObject", sender: nil)
            }
        }
    }