这是我的问题: 我滚动它时,我的UITableViewController滞后。它有大约60个自定义单元格。但是,在模拟器上它没有任何滞后。 这是我的代码: 的 CustomCell.m
#import "CustomCell.h"
@implementation CustomCell
@synthesize nameLabel,costLabel,giftPicture;
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Initialization code
nameLabel = [[UILabel alloc]init];
nameLabel.textAlignment = UITextAlignmentLeft;
nameLabel.textColor = [UIColor colorWithRed:25/256.0 green:98/256.0 blue:52/256.0 alpha:1.0];
costLabel = [[UILabel alloc]init];
costLabel.textAlignment = UITextAlignmentLeft;
giftPicture = [[UIImageView alloc]init];
[self.contentView addSubview:nameLabel];
[self.contentView addSubview:costLabel];
[self.contentView addSubview:giftPicture];
costLabel.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"background4"]];
nameLabel.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"background4"]];
}
return self;
}
- (void)layoutSubviews {
[super layoutSubviews];
CGRect contentRect = self.contentView.bounds;
CGFloat boundsX = contentRect.origin.x;
CGRect frame;
frame= CGRectMake(boundsX+10,10, 50, 50);
giftPicture.frame = frame;
frame= CGRectMake(boundsX+70 ,10, 350, 25);
nameLabel.frame = frame;
frame= CGRectMake(boundsX+70 ,40, 350, 18);
costLabel.frame = frame;
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
// Configure the view for the selected state
}
@end
List.m
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [array1 count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[CustomCell alloc] initWithFrame:CGRectZero];
}
// Configure the cell...
NSString *cellValue = [array1 objectAtIndex:indexPath.row];
//cell.textLabel.text = cellValue; // загаловок клетки
[cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator]; // сделал чтобы клетка была со стрелочкой
cell.nameLabel.text = cellValue;
NSDictionary *mainDictionary = [[NSDictionary alloc]init];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSArray *languages = [defaults objectForKey:@"AppleLanguages"];
NSString *currentLanguage = [languages objectAtIndex:0];
if([currentLanguage isEqualToString:@"en"])
{
mainDictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"animals" ofType:@"txt"]];
}
NSEnumerator *enumerator = [mainDictionary objectEnumerator];
id returnValue;
while ((returnValue = [enumerator nextObject]))
{
if([cell.nameLabel.text isEqualToString:[returnValue valueForKey:@"name"]] )
{
cell.animalPicture.image = [UIImage imageNamed:[returnValue valueForKey:@"icon"]];
cell.costLabel.text = [NSString stringWithFormat:@"$%@ - $%@",[returnValue valueForKey:@"minAge"],[returnValue valueForKey:@"maxAge"]];
}
}
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 75;
}
@end
我试图让自定义单元格为空(删除标签和图像),只是因为好奇,但它没有改变任何东西。 你能告诉我,我应该检查什么来解决这些滞后问题? 谢谢!
答案 0 :(得分:4)
在处理iOS应用中的性能问题时,请相信设备,而不是模拟器。我已经看到性能两种方式(有时在模拟器上更好,有时在设备上更好)。记住在设备上进行测试可以为您节省大量时间。
滞后滚动很可能是滚动代码被图像处理或其他网络活动阻止的结果。
我个人对调试这些情况的偏好是从空表视图开始。即使有数千个细胞,这也应该能够顺畅滚动。然后逐个添加tableView内容,并注意滚动开始滞后的时间。
答案 1 :(得分:4)
对于每个表格单元格,您在-cellForRowAtIndexPath
方法中使用UIImage
进行了大量初始化。您应该只执行一次并缓存图像。
答案 2 :(得分:4)
是的,这只是我想要为每个表格单元做的TON工作(也绝不会永远不相信模拟器的性能,它与设备上的行为方式无关)。你应该尝试使用工具确定准确的时间,但如果我不得不看一下,我会说:
NSDictionary *mainDictionary = [[NSDictionary alloc]init];
对于初学者来说,这个a)似乎没有意义,因为下一行和b)看起来你正在泄漏这个。
mainDictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"animals" ofType:@"txt"]];
每次加载此文件的性能都不是很好,您应该将此数据一次性地添加到视图控制器中,而不是每次填写单元格时。
NSEnumerator *enumerator = [mainDictionary objectEnumerator];
id returnValue;
while ((returnValue = [enumerator nextObject]))
{
if([cell.nameLabel.text isEqualToString:[returnValue valueForKey:@"name"]] )
{
这一整块,我会重做。这是直截了当的,使用NSDictionary错误。一个字典包含一个Key和一个Value,你不应该用枚举器自己扫描整个东西,通过字符串比较找到你想要的值,你应该使用类似的东西
[mainDictonary objectForKey:@"thingYouWant"];
执行你所说的就像是字典的60个完整枚举和字符串比较对表性能不好并且没有必要。
这将是我工作的东西首先检查性能然后根据需要返工,我愿意打赌你的性能问题包含在那些块中。