呈现UITableViewController时出现意外延迟

时间:2015-04-25 07:53:57

标签: ios objective-c uitableview tableviewcell

我在UITableViewCell中有自定义UITableViewController,但当Controller尝试将自定义单元格出列时,则需要很长时间(如2000毫秒)。

这行代码会导致问题

KidsListTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"kidsReuseIdentifier" forIndexPath:indexPath];

KidsListTableViewCell是一个自定义单元格,其中包含几个UIButton s,一些UILabel来显示信息。还有两个委托方法。呈现该视图不应该那么慢。顺便说一句,自定义单元格中的所有信息基本上都是静态的。

这是UITableViewController的完整代码。我将自定义视图和常规视图放在不同的部分,我不认为这会导致问题。

#import "KidDetailTableViewController.h"
#import "KidDetailHeaderTableViewCell.h"
#import <AssetsLibrary/AssetsLibrary.h>
#import "Helper.h"

@interface KidDetailTableViewController () <KidDetailHeaderCellDelegate>

@end

@implementation KidDetailTableViewController
{
    KidDetailHeaderTableViewCell *headerCell;
}

- (void)viewDidLoad {
    [super viewDidLoad];

    [self.tableView registerNib:[UINib nibWithNibName:@"KidDetailHeader" bundle:nil] forCellReuseIdentifier:@"kidDetail"];

    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"detailCell"];


    self.tableView.showsVerticalScrollIndicator = NO;

}


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

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // Return the number of sections.
    return 2;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    switch (section) {
        case 0:
            return 1;
            break;

        default:
            return 10;
            break;
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    if (indexPath.section == 0) {
        if (!headerCell) {


            headerCell = [tableView dequeueReusableCellWithIdentifier:@"kidDetail"];

            headerCell.delegate = self;


            // Keep the background color for the cell when select.
            headerCell.selectionStyle = UITableViewCellSelectionStyleNone;

            headerCell.nicknameLabel.text = _kidNeedsToShow.nickname;

            NSString *kidFullName = [NSString stringWithFormat:@"%@ %@ %@", _kidNeedsToShow.firstName, _kidNeedsToShow.midName, _kidNeedsToShow.lastName];

            kidFullName ? (headerCell.fullNameLabel.text = @"") : (headerCell.fullNameLabel.text = kidFullName);


            // Set thumb image or use default
            // if there isn't image, use default.
            ALAssetsLibrary *library = [ALAssetsLibrary new];
            [library assetForURL:_kidNeedsToShow.photoURL resultBlock:^(ALAsset *asset) {
                [headerCell.avatarImage setImage:[UIImage imageWithCGImage:[[asset defaultRepresentation] fullResolutionImage]]];
            } failureBlock:nil];
            return headerCell;
        }
        else return headerCell;
    }

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"detailCell" forIndexPath:indexPath];
    return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.section == 0) {
        return 290;
    }
    else return 60;
}

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.section == 0) {
        return 290;
    }
    else return 60;
}

- (void)didClickLeftButton:(UIButton *)leftButton {
    [self dismissViewControllerAnimated:YES completion:nil];
}

@end

我试图将dequeueReusableCellWithIdentifier放入另一个帖子中,显然它不会起作用。

更新:KidDetailHeaderTableViewCell.m

- (void)awakeFromNib {
    // Initialization code
    [_avatarImage.layer setCornerRadius:_avatarImage.frame.size.width / 2];
    [_avatarImage.layer setBorderColor:[UIColor whiteColor].CGColor];
    [_avatarImage.layer setBorderWidth:1.0];
    [_avatarImage setClipsToBounds:YES];

}

- (IBAction)leftButtonClicked:(UIButton *)sender {
    if (self.delegate && [self.delegate respondsToSelector:@selector(didClickLeftButton:)]) {
        [self.delegate didClickLeftButton:sender];
    }
}
- (IBAction)rightButtonClicked:(UIButton *)sender {
    if (self.delegate && [self.delegate respondsToSelector:@selector(didClickRightButton:)]) {
        [self.delegate didClickRightButton:sender];
    }
}

KidDetailHeaderTableViewCell.h

@protocol KidDetailHeaderCellDelegate <NSObject>

@optional
- (void)didClickLeftButton:(UIButton *)leftButton;
- (void)didClickRightButton:(UIButton *)rightButton;

@end

@interface KidDetailHeaderTableViewCell : UITableViewCell

@property (weak) id<KidDetailHeaderCellDelegate> delegate;

@property (weak, nonatomic) IBOutlet UILabel *fullNameLabel;
@property (weak, nonatomic) IBOutlet UIImageView *avatarImage;
@property (weak, nonatomic) IBOutlet UILabel *nicknameLabel;

@property (weak, nonatomic) IBOutlet UILabel *ageText;
@property (weak, nonatomic) IBOutlet UILabel *ageLabel;

@property (weak, nonatomic) IBOutlet UILabel *momentsStatistics;
@property (weak, nonatomic) IBOutlet UILabel *momentsLabel;

@property (weak, nonatomic) IBOutlet UIButton *rightButton;
@property (weak, nonatomic) IBOutlet UIButton *leftButton;

@end

更新2: 仪器的截图 screenshot of instrument

用于设置单元格高度的代码。我有两个部分,第一部分实际上只用于标题,高度为290。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.section == 0) {
        return 290;
    }
    else return 60;
}

1 个答案:

答案 0 :(得分:0)

我的一位朋友指出问题是由自定义字体引起的(是的!我在自定义视图中使用了自定义字体)。我仍然不确定为什么会导致这个问题(字体名为&#39;英雄&#39;),但希望这会帮助其他人。