Ios 在哪里设置UITableViewCell而不是cellForRowAtIndexPath?目标-C

Ios 在哪里设置UITableViewCell而不是cellForRowAtIndexPath?目标-C,ios,objective-c,uitableview,Ios,Objective C,Uitableview,为了提高UITableView性能,我正在考虑将UITableViewCell的所有设置重新定位到CellForRowatineXpath之外 此时,我在tableview中设置了几个自定义单元格,这些单元格位于CellForRowatineXpath中。但正因为如此,每次我在tableview中滚动,所以每次屏幕上显示单元格时,都会再次进行设置,造成延迟 我试图通过使用单元格的类变量将设置放在viewDidLoad中,但没有效果。你知道我可以把我所有的单元格设置移到哪里吗,特别是如果可能的话

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

此时,我在tableview中设置了几个自定义单元格,这些单元格位于CellForRowatineXpath中。但正因为如此,每次我在tableview中滚动,所以每次屏幕上显示单元格时,都会再次进行设置,造成延迟

我试图通过使用单元格的类变量将设置放在viewDidLoad中,但没有效果。你知道我可以把我所有的单元格设置移到哪里吗,特别是如果可能的话

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

编辑: 如前所述,以下是我的CellForRowatineXpathMethod:

- (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;
}必须尝试一下。除了加载图像,我没有看到其他可能导致延迟的代码。可能会有帮助的事情很少

  • 即使imagenamed应该返回缓存映像(如果已加载),也可以尝试与GCD异步加载映像
  • web服务代码是否导致延迟
  • 运行仪器(时间分析器?),查看是什么导致了延迟或延迟
  • 我必须试一下。除了加载图像,我没有看到其他可能导致延迟的代码。可能会有帮助的事情很少

  • 即使imagenamed应该返回缓存映像(如果已加载),也可以尝试与GCD异步加载映像
  • web服务代码是否导致延迟
  • 运行仪器(时间分析器?),查看是什么导致了延迟或延迟

  • 虽然那里有很多代码,但似乎没有什么东西会非常慢

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

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

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

    如果你这样做,那么,举例来说

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

    if (appliedTheme.darkMode)
    
    复杂的字符串比较替换为简单的布尔检查;这要快得多

    类似地,对主题使用枚举可以得到如下结果

    switch (appliedTheme.theme) {
        case DarkModeGreen-Theme:
           ...
    
    cell.startStopWebServerButton.backgroundColor = appliedTheme.buttonBackgroundColor
    
    现在,Expensive字符串比较已被快速整数比较所取代

    最后,创建
    UIColor
    s的成本相对较高。您也可以将其移动到
    主题
    对象中。创建主题实例时,将颜色显示为属性。这样你就可以摆脱我建议的
    开关
    语句,每次都创建颜色,然后简单地说

    switch (appliedTheme.theme) {
        case DarkModeGreen-Theme:
           ...
    
    cell.startStopWebServerButton.backgroundColor = appliedTheme.buttonBackgroundColor
    

    虽然那里有很多代码,但似乎没有什么东西会非常慢

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

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

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

    如果你这样做,那么,举例来说

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

    if (appliedTheme.darkMode)
    
    复杂的字符串比较替换为简单的布尔检查;这要快得多

    类似地,对主题使用枚举可以得到如下结果

    switch (appliedTheme.theme) {
        case DarkModeGreen-Theme:
           ...
    
    cell.startStopWebServerButton.backgroundColor = appliedTheme.buttonBackgroundColor
    
    现在,Expensive字符串比较已被快速整数比较所取代

    最后,创建
    UIColor
    s的成本相对较高。您也可以将其移动到
    主题
    对象中。创建主题实例时,将颜色显示为属性。这样你就可以摆脱我建议的
    开关
    语句,每次都创建颜色,然后简单地说

    switch (appliedTheme.theme) {
        case DarkModeGreen-Theme:
           ...
    
    cell.startStopWebServerButton.backgroundColor = appliedTheme.buttonBackgroundColor
    

    显示您的代码
    cellForRowAt
    应该是一个相对较小、快速的函数,因为它被多次调用。您不应使用此方法获取数据或执行复杂的计算。您可以在“立即编辑”中找到代码!显示您的代码
    cellForRowAt
    应该是一个相对较小、快速的函数,因为它被多次调用。您不应使用此方法获取数据或执行复杂的计算。您可以在“立即编辑”中找到代码!很抱歉没有在开头添加代码,您可以在“立即编辑”中找到它!不,这与导致延迟的web服务器无关,因为问题存在,即使它没有运行!更一般地说,延迟也存在于实现自定义单元类的其他类上。所以我认为问题在于你建议的图像加载和Paulw11建议的主题管理!我也会试试你说的,谢谢你的提示;)很抱歉没有在开头添加代码,您可以在“立即编辑”中找到它!不,这与导致延迟的web服务器无关,因为问题存在,即使它没有运行!更一般地说,滞后也出现在其他类上