【问题标题】:Where to set UITableViewCell other than in cellForRowAtIndexPath ? Objective-C除了在 cellForRowAtIndexPath 之外,在哪里设置 UITableViewCell ? Objective-C
【发布时间】:2017-06-21 20:56:12
【问题描述】:

为了提高 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;

}

【问题讨论】:

  • 显示您的代码。 cellForRowAt 应该是一个相对较小、快速的函数,因为它被多次调用。您不应在此方法中获取数据或执行复杂的计算。
  • 现在可以在edit中找到代码了!

标签: ios objective-c uitableview


【解决方案1】:

虽然那里有很多代码,但似乎没有什么会慢得可怕。

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

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

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

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

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

变成

if (appliedTheme.darkMode)

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

同样,对主题使用枚举会得到类似的结果

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

现在,昂贵的字符串比较已被快速整数比较所取代。

最后,创建UIColors 的成本相对较高。您也可以将其移动到您的 Theme 对象中。当您创建主题的实例时,将颜色作为属性公开。这样你就可以摆脱我建议的switch 声明,每次都创建颜色,然后简单地说类似

cell.startStopWebServerButton.backgroundColor = appliedTheme.buttonBackgroundColor

【讨论】:

  • 感谢您的所有提示,我会实施这些,看看是否有改进!无论如何,我很感激你花时间发布这么好的回复:)
【解决方案2】:

必须尝试prepareforreuse。除了加载图像之外,我没有看到其他可能导致延迟的代码。一些可能有帮助的事情

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

【讨论】:

  • 很抱歉没有在开头添加代码,您现在可以在编辑中找到它!
  • 不,这与导致延迟的 Web 服务器无关,因为即使它没有运行也存在问题!更一般地说,延迟也存在于实现自定义单元类的其他类上。所以我认为问题在于您建议的图像加载和 Paulw11 建议的主题管理!我也会试试你说的,谢谢你的提示;)
猜你喜欢
  • 1970-01-01
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
  • 2017-12-12
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
相关资源
最近更新 更多