2015-04-25 2 views
0

У меня есть пользовательский UITableViewCell в UITableViewController, но когда контроллер пытается удалить из пользовательской ячейки, это займет много времени (например, 2000 мс).Неожиданная задержка при представлении UITableViewController

Эта строка кода приводит к возникновению проблемы

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

KidsListTableViewCell обычай клетка, которая включает в себя пару из UIButton с, некоторые 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 в другой поток, по-видимому, он не будет работать.

UPDATE: 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 

UPDATE 2: скриншот инструмента screenshot of instrument

Код для набора высоты ячейки. У меня есть две секции, первая секция фактически используется только для заголовка, высота 290.

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

Можете ли вы добавить код из 'KidDetailHeaderTableViewCell'? (инициализаторы, '-prepareForReuse', -'awakeFromNib') – Moxy

+0

@Moxy Обновлено. Я использовал awakeFromNib и устанавливал UIImageView от квадрата до раунда. Я пытался избавиться от него, не работал. – Alex

+0

Использовали ли вы инструменты, чтобы найти продолжительность 2000 мс? – Moxy

ответ

0

Один мой друг отметил, что проблема была вызвана самодельного шрифта (Да! Я использовал специальный шрифт в пользовательский вид). Я все еще не уверен, почему это вызывает проблему (шрифт под названием «герой»), но надеюсь, что это поможет кому-то другому.

Смежные вопросы