除了在cellForRowAtIndexPath中设置UITableViewCell的位置? Objective-C的

时间:2017-06-21 20:56:13

标签: ios objective-c uitableview

为了提高UITableView的性能,我正在考虑将所有UITableViewCell的设置重新定位在cellForRowAtIndexPath之外。

此时,我在tableview中有几个自定义单元格,我在cellForRowAtIndexPath中设置。但正因为如此,每次我在我的桌面视图中滚动,所以每当一个单元格必须在屏幕上显示时,设置再次完成,导致滞后。

我试图通过为我的单元格使用类变量将设置放在viewDidLoad中,但没有任何效果。你有什么想法我可以移动我所有细胞的设置,但特别是如果可能的话?

提前致谢,祝你有愉快的一天!

编辑: 如上所述,这是我的cellForRowAtIndexPathMethod:

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

NSString *CellIdentifier = [menuItems objectAtIndex:indexPath.row];
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
cell.delegate = self;


if ([appliedTheme hasPrefix:@"DarkMode"]) {

    self.tableView.backgroundColor = [UIColor colorWithRed:0.20 green:0.20 blue:0.20 alpha:1.0];
    cell.backgroundColor = [UIColor colorWithRed:0.20 green:0.20 blue:0.20 alpha:1.0];
    cell.cardView.backgroundColor = [UIColor colorWithRed:0.30 green:0.30 blue:0.30 alpha:1.0];


    cell.webServerIntroLabel.textColor = [UIColor whiteColor];
    cell.webServerOptionsTitle.textColor = [UIColor whiteColor];
    cell.webServerOptionsReachableAtLabel.textColor = [UIColor whiteColor];

}else {

    self.tableView.backgroundColor = [UIColor colorWithRed:0.92 green:0.92 blue:0.92 alpha:1.0];
    cell.backgroundColor = [UIColor colorWithRed:0.92 green:0.92 blue:0.92 alpha:1.0];
    cell.cardView.backgroundColor = [UIColor whiteColor];


    cell.webServerIntroLabel.textColor = [UIColor blackColor];
    cell.webServerOptionsTitle.textColor = [UIColor blackColor];
    cell.webServerOptionsReachableAtLabel.textColor = [UIColor blackColor];

}


if ([CellIdentifier isEqualToString:@"webServerIntro"]) {

    cell.webServerIntroImageView.image = [UIImage imageNamed:webServerIntroIconToShow];
    cell.webServerIntroLabel.adjustsFontSizeToFitWidth = YES;
    cell.webServerIntroLabel.numberOfLines = 0;
    [cell.webServerIntroLabel sizeToFit];
    cell.webServerIntroLabel.text = @"Some text";

}else if ([CellIdentifier isEqualToString:@"webServerOptions"]) {        

    cell.webServerOptionsTitle.adjustsFontSizeToFitWidth = YES;
    cell.webServerOptionsTitle.text = NSLocalizedString(@"Web Server Options", nil);
    cell.webServerOptionsStatusLabel.adjustsFontSizeToFitWidth = YES;

    if (!webServerStarted) {

        cell.webServerOptionsImageView.image = [UIImage imageNamed:@"Not-Checked"];
        cell.webServerOptionsStatusLabel.text = NSLocalizedString(@"Not Running", nil);
        cell.serverURLLabel.text = NSLocalizedString(@"Not Reachable", nil);
        cell.ipAddressURLLabel.text = NSLocalizedString(@"Not Reachable", nil);
        [cell.startStopWebServerButton setTitle:NSLocalizedString(@"Start Web Server", nil) forState:UIControlStateNormal];


        cell.webServerStartedBool = NO;

    }else {

        NSString *serverURL = [self deviceName];
        serverURL = [serverURL stringByReplacingOccurrencesOfString:@" " withString:@"-"];


        cell.webServerOptionsImageView.image = [UIImage imageNamed:@"Checked"];
        cell.webServerOptionsStatusLabel.text = NSLocalizedString(@"Running", nil);
        cell.serverURLLabel.text = [NSString stringWithFormat:@"http://%@.local", serverURL];
        cell.ipAddressURLLabel.text = [NSString stringWithFormat:@"%@", webUploader.serverURL];
        [cell.startStopWebServerButton setTitle:NSLocalizedString(@"Stop Web Server", nil) forState:UIControlStateNormal];


        cell.webServerStartedBool = YES;

    }

    cell.webServerOptionsStatusLabel.textColor = [UIColor lightGrayColor];
    cell.webServerOptionsReachableAtLabel.adjustsFontSizeToFitWidth = YES;
    cell.webServerOptionsReachableAtLabel.text = NSLocalizedString(@"Reachable At :", nil);
    cell.ipAddressURLLabel.adjustsFontSizeToFitWidth = YES;
    cell.ipAddressURLLabel.textColor = [UIColor lightGrayColor];
    cell.ipAddressURLLabel.layer.borderWidth = 1.0f;
    cell.ipAddressURLLabel.layer.borderColor = [[UIColor lightGrayColor] CGColor];
    cell.ipAddressURLLabel.layer.cornerRadius = 5;
    cell.serverURLLabel.adjustsFontSizeToFitWidth = YES;
    cell.serverURLLabel.textColor = [UIColor lightGrayColor];
    cell.serverURLLabel.layer.borderWidth = 1.0f;
    cell.serverURLLabel.layer.borderColor = [[UIColor lightGrayColor] CGColor];
    cell.serverURLLabel.layer.cornerRadius = 5;
    cell.startStopWebServerButton.layer.borderWidth = 1.0f;
    cell.startStopWebServerButton.layer.borderColor = [[UIColor clearColor] CGColor];
    cell.startStopWebServerButton.layer.cornerRadius = 5;
    cell.startStopWebServerButton.titleLabel.adjustsFontSizeToFitWidth = YES;


    if ([appliedTheme isEqualToString:@"Default-Theme"]) {

        cell.startStopWebServerButton.backgroundColor = [UIColor colorWithRed:0 green:0.478 blue:0.875 alpha:1]; /*#007ADF : Bleu iOS*/

    }else if ([appliedTheme isEqualToString:@"Red-Theme"]) {

        cell.startStopWebServerButton.backgroundColor = [UIColor colorWithRed:0.90 green:0.07 blue:0.00 alpha:1.0]; /*#E61100 : Rouge*/

    }else if ([appliedTheme isEqualToString:@"Orange-Theme"]) {

        cell.startStopWebServerButton.backgroundColor = [UIColor colorWithRed:0.83 green:0.33 blue:0.00 alpha:1.0]; /*#D35400 : Orange*/

    }else if ([appliedTheme isEqualToString:@"Yellow-Theme"]) {

        cell.startStopWebServerButton.backgroundColor = [UIColor colorWithRed:0.95 green:0.61 blue:0.07 alpha:1.0]; /*#F39C12 : Jaune*/

    }else if ([appliedTheme isEqualToString:@"Green-Theme"]) {

        cell.startStopWebServerButton.backgroundColor = [UIColor colorWithRed:0.15 green:0.68 blue:0.38 alpha:1.0]; /*#27AE60 : Vert*/

    }else if ([appliedTheme isEqualToString:@"Purple-Theme"]) {

        cell.startStopWebServerButton.backgroundColor = [UIColor colorWithRed:0.56 green:0.27 blue:0.68 alpha:1.0]; /*#8E44AD : Violet*/

    }else if ([appliedTheme isEqualToString:@"Gray-Theme"]) {

        cell.startStopWebServerButton.backgroundColor = [UIColor colorWithRed:0.74 green:0.76 blue:0.78 alpha:1.0]; /*#BDC3C7 : Gris*/

    }else if ([appliedTheme isEqualToString:@"DarkGray-Theme"]) {

        cell.startStopWebServerButton.backgroundColor = [UIColor colorWithRed:0.50 green:0.55 blue:0.55 alpha:1.0]; /*#7F8C8D : Gris foncé*/

    }else if ([appliedTheme isEqualToString:@"DesaturatedBlue-Theme"]) {

        cell.startStopWebServerButton.backgroundColor = [UIColor colorWithRed:0.17 green:0.24 blue:0.31 alpha:1.0]; /*#2C3E50 : Bleu désaturé*/

    }else if ([appliedTheme isEqualToString:@"VeryDarkGray-Theme"]) {

        cell.startStopWebServerButton.backgroundColor = [UIColor colorWithRed:0.20 green:0.20 blue:0.20 alpha:1.0]; /*#333333 : Gris très foncé*/

    }else if ([appliedTheme isEqualToString:@"Black-Theme"]) {

        cell.startStopWebServerButton.backgroundColor = [UIColor colorWithRed:0.00 green:0.00 blue:0.00 alpha:1.0]; /*#000000 : Noir*/

    }else if ([appliedTheme isEqualToString:@"DarkModeDefault-Theme"]) {

        cell.startStopWebServerButton.backgroundColor = [UIColor colorWithRed:0 green:0.478 blue:0.875 alpha:1]; /*#007ADF : Bleu iOS*/

    }else if ([appliedTheme isEqualToString:@"DarkModeRed-Theme"]) {

        cell.startStopWebServerButton.backgroundColor = [UIColor colorWithRed:0.90 green:0.07 blue:0.00 alpha:1.0]; /*#E61100 : Rouge*/

    }else if ([appliedTheme isEqualToString:@"DarkModeOrange-Theme"]) {

        cell.startStopWebServerButton.backgroundColor = [UIColor colorWithRed:0.83 green:0.33 blue:0.00 alpha:1.0]; /*#D35400 : Orange*/

    }else if ([appliedTheme isEqualToString:@"DarkModeYellow-Theme"]) {

        cell.startStopWebServerButton.backgroundColor = [UIColor colorWithRed:0.95 green:0.61 blue:0.07 alpha:1.0]; /*#F39C12 : Jaune*/

    }else if ([appliedTheme isEqualToString:@"DarkModeGreen-Theme"]) {

        cell.startStopWebServerButton.backgroundColor = [UIColor colorWithRed:0.15 green:0.68 blue:0.38 alpha:1.0]; /*#27AE60 : Vert*/

    }else if ([appliedTheme isEqualToString:@"DarkModePurple-Theme"]) {

        cell.startStopWebServerButton.backgroundColor = [UIColor colorWithRed:0.56 green:0.27 blue:0.68 alpha:1.0]; /*#8E44AD : Violet*/

    }else if ([appliedTheme isEqualToString:@"DarkModeGray-Theme"]) {

        cell.startStopWebServerButton.backgroundColor = [UIColor colorWithRed:0.74 green:0.76 blue:0.78 alpha:1.0]; /*#BDC3C7 : Gris*/

    }else if ([appliedTheme isEqualToString:@"DarkModeDarkGray-Theme"]) {

        cell.startStopWebServerButton.backgroundColor = [UIColor colorWithRed:0.50 green:0.55 blue:0.55 alpha:1.0]; /*#7F8C8D : Gris foncé*/

    }else if ([appliedTheme isEqualToString:@"DarkModeDesaturatedBlue-Theme"]) {

        cell.startStopWebServerButton.backgroundColor = [UIColor colorWithRed:0.17 green:0.24 blue:0.31 alpha:1.0]; /*#2C3E50 : Bleu désaturé*/

    }else if ([appliedTheme isEqualToString:@"DarkModeVeryDarkGray-Theme"]) {

        cell.startStopWebServerButton.backgroundColor = [UIColor colorWithRed:0.20 green:0.20 blue:0.20 alpha:1.0]; /*#333333 : Gris très foncé*/

    }else if ([appliedTheme isEqualToString:@"DarkModeBlack-Theme"]) {

        cell.startStopWebServerButton.backgroundColor = [UIColor colorWithRed:0.00 green:0.00 blue:0.00 alpha:1.0]; /*#000000 : Noir*/

    }

}else {



}


return cell;

}

2 个答案:

答案 0 :(得分:2)

虽然你有很多代码,但似乎没什么可怕的慢。

这是性能方面的一个小问题,但设置tableview背景颜色的代码应该在viewWillAppear而不是cellForRowAt,因为每次都不需要设置背景颜色细胞出列。

通过将所有与主题相关的代码移动到单元子类中,您还可以大大简化此功能。在传递主题的单元格上调用一个函数,让单元格设置所有这些东西;将执行相同数量的代码,但cellForRowAt将更小且更易于阅读。

我认为你可以通过消除与主题相关的重复字符串操作来获得一些性能。创建一个表示主题的类或结构并使用枚举(这个东西比Swift容易得多,但你仍然可以在ObjectiveC中完成)。

如果你这样做,那么,例如,

if ([appliedTheme hasPrefix:@"DarkMode"])

变为

if (appliedTheme.darkMode)

复杂的字符串比较用简单的布尔检查替换;这要快得多

同样,使用主题的枚举可以获得类似

的内容
switch (appliedTheme.theme) {
    case DarkModeGreen-Theme:
       ...

现在,已经用快速整数比较替换了广泛的字符串比较。

最后,创建UIColor是相对昂贵的。您也可以将其移动到Theme对象中。创建主题的实例时,将颜色显示为属性。通过这种方式,您可以摆脱我建议的switch语句并每次创建颜色,只需说出类似

的内容
cell.startStopWebServerButton.backgroundColor = appliedTheme.buttonBackgroundColor

答案 1 :(得分:0)

必须尝试prepareforreuse。除了加载图像,我没有看到可能导致延迟的其他代码。很少有可能有用的东西

  1. 即使imagenamed应该返回已经加载的缓存图像,尝试使用GCD加载图像异步
  2. 网络服务代码是否会导致延迟?
  3. 运行仪器(时间分析器?)以查看导致滞后或延迟的原因