2017-06-21 14 views
0

UITableViewのパフォーマンスを向上させたいと考えて、私は自分のUITableViewCellのすべての設定をcellForRowAtIndexPathの外に再配置することを考えています。cellForRowAtIndexPath以外のUITableViewCellを設定する場所は? Objective-C

この時点で、cellviewRowAtIndexPath内に設定したテーブルビュー内にカスタムセルがいくつかあります。しかし、このために、私は自分のテーブルビュー内をスクロールするたびに、セルが画面上に表示されなければならないたびに設定がやり直され、遅延が発生します。

私は、セルにクラス変数を使用しても、効果を持たない設定をviewDidLoad内に配置しようとしました。あなたがどこで私の細胞の設定をどこに移すことができるか考えていますか?特にそれが可能ならば?

ありがとうございました。素敵な日です!

EDIT:

- (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; 

}

+0

コードを表示してください。 'cellForRowAt'は何度も呼び出されるので、比較的小さくてすばやい関数でなければなりません。このメソッドでは、データをフェッチしたり、複雑な計算を実行したりしないでください。 – Paulw11

+0

編集中のコードを見つけることができます! – Synny

答えて

0

が試しprepareforreuseする必要があります尋ねたよう は、ここに私のcellForRowAtIndexPathMethodです。画像を読み込むだけでなく、遅延を引き起こす可能性のある他のコードは表示されません。

  1. それがすでにロードされていた場合imagenamedがキャッシュ画像を返すべきであるにもかかわらず、GCD
  2. で画像の非同期をロードしようと役立つかもしれないいくつかのことは、任意の遅延の原因となるWebサービスのコードですか?
  3. 実行楽器(時間プロファイラ?)遅れを引き起こしているものを見たり
+0

冒頭にコードを追加して申し訳ありませんが、今すぐ編集で見つけることができます! – Synny

+0

実行していなくても問題が存在するので、遅れを引き起こすWebサーバーに関連するものはありません。より一般的には、ラグはカスタムセルクラスも実装する他のクラスにも存在します。だから私はあなたが示唆したような画像ロードと、Paulw11が示唆したようなテーマ管理を伴う問題だと思います!私はあなたが言ったことも試してみましょう、あなたのヒントのおかげで;) – Synny

2

を遅らせるためにあなたがそこにコードの多くを持っているが、それがものすごく遅くなるように、何も思いません。

パフォーマンスの面ではマイナーな点ですが、セルがデキューされるたびに背景色を設定する必要がないため、テーブルビューの背景色を設定するコードはcellForRowAtではなくviewWillAppearにする必要があります。

また、テーマ関連のコードをすべてセルのサブクラスに移動することで、この機能を大幅に簡素化できます。テーマを通過するセル上の関数を呼び出し、セルにそのすべての要素を設定させます。同じ量のコードが実行されますが、cellForRowAtは小さく、読みやすくなります。

ここでは、テーマに関連する繰り返しの文字列操作を削除することでパフォーマンスを得ることができると思います。あなたのテーマを表すクラスまたは構造体を作成し、列挙型を使用します(これはSwiftですが、ObjectiveCでもやりやすいです)。あなたがこれを行う場合は

、その後、例えば、

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

は、複雑な文字列の比較が簡単なブールチェックに置き換えられ

if (appliedTheme.darkMode) 

なり、これは、あなたが今expesnsive文字列の比較は、迅速な整数比較に置き換えられている

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

ような何かを得るテーマの列挙を使用して、同様に

はるかに高速です。

最後に、UIColorの作成は比較的高価です。それをあなたのThemeオブジェクトにも移動できます。テーマのインスタンスを作成するときは、色をプロパティとして公開します。このようにして私が提案したswitchのステートメントを取り除き、毎回色をつくり、単純に何かを言うようにしてください。

+0

あなたのヒントすべてをありがとう、私はこれらを実装し、私は改善を得るかどうかを確認します!とにかく私はあなたがそのような良い返信を投稿した時間を感謝します:) – Synny

関連する問題