テーブルビューリロードセクションがクラッシュする


7

セクションごとに4つのセクションと1つのテーブルビューセルを持つテーブルビューがあります。最初のセルはアクセサリビューとしてuiswitchを持ち、昼間モードと夜間モードを切り替えることで、アプリのカラーテーマを制御します。スイッチがヒットしたら、ナビゲーションバーの色と背景色を変更する関数が呼び出されます。その機能では、新しい色で表自体を更新するには、

[self.tableview reloadData]; 

も入力してください。これは、正常に動作しますが、それには何のアニメーションをtheresのないので、私が代わりに

その行が立ち往生スイッチとアプリがフリーズを使用している
[self.tableView reloadSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 3)] withRowAnimation:UITableViewRowAnimationFade]; 

これを使用していました。言うまでもなく、クラッシュログはなく、フリーズし、uiswitchはアニメーションの途中で停止します。

アクセサリビューを含むセルがないセクションを再読み込みでき、フェードアニメーションと完全に動作することがわかりました。私。これは動作します

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:2] withRowAnimation:UITableViewRowAnimationFade]; 

第3セクションにはアクセサリビューのセルがありません。しかし、アクセサリビュー(セクション0と2)が含まれているセルがあるセクションであれば、アプリを再読み込みしようとするとフリーズします。

これは何が起こっているのですか?以下は私のcellForRowAtIndexPath

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

static NSString *cellIdentifier; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
if (cell == nil) cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifier]; 

if (indexPath.section == 0) { 

    cell.textLabel.text = [section0 objectAtIndex:indexPath.row]; 
    cell.accessoryType = UITableViewCellAccessoryNone; 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; 

    if (indexPath.row == 0) { 

     cell.accessoryView = colorSchemeSwitch; 
    } 

    else if (indexPath.row == 1) { 

     cell.accessoryView = autoLockSwitch; 
    } 
} 

else if (indexPath.section == 1) { 

    cell.textLabel.text = [section1 objectAtIndex:indexPath.row]; 
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
} 

else if (indexPath.section == 2) { 

    cell.textLabel.text = [section2 objectAtIndex:indexPath.row]; 
    cell.accessoryType = UITableViewCellAccessoryNone; 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    cell.detailTextLabel.text = [NSString stringWithFormat:@"%i \t", (int)app.fontSize]; 
    fontSizeSlider.value = app.fontSize; 
    cell.accessoryView = fontSizeSlider; 
} 

else if (indexPath.section == 3) { 

    cell.textLabel.text = [section3 objectAtIndex:indexPath.row]; 
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    cell.detailTextLabel.text = app.color; 
} 

cell.backgroundColor = app.cellBackgroundColor; 
cell.textLabel.textColor = app.textColor; 
UIView *backgroundColorView = [[UIView alloc] init]; 
backgroundColorView.backgroundColor = app.cellSelectedColor; 
[cell setSelectedBackgroundView:backgroundColorView]; 

return cell; 
} 
  0

質問にCrash Logを追加してください。 05 11月. 142014-11-05 13:38:29

  0

本当に奇妙な、クラッシュログはありません、アプリはフリーズし、クラッシュしません。スイッチが途中で止まり、アプリが応答しなくなります。クラッシュログはありません 06 11月. 142014-11-06 02:25:27

  0

提案はありますか? 12 11月. 142014-11-12 06:55:41

  0

テーブルセルオブジェクトを管理できます。 CellForRawAtIndexPath:Methodで多くの計算を避けてください。できるだけシンプルにしてください。奇妙なことザッツ 12 11月. 142014-11-12 07:10:24

7

UITableViewCellに同じ問題がありました。UISwitchです。私はセクションをリロードする前に[self.tableview reloadData]を呼び出すことによって、問題を解決:

NSIndexSet *sections = [[NSIndexSet alloc] initWithIndex:2]; 
[self.tableView reloadData]; 
[self.tableView reloadSections:sections withRowAnimation:UITableViewRowAnimationFade]; 

を呼び出す場合にも同じ問題が起こる:

[self.tableView reloadRowsAtIndexPaths:[self.tableView indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationFade] 

を最初にデータをリロードしません。

  0

あなたは伝説です!それは完璧に働いた。これは単純だとは信じられません 14 3月. 152015-03-14 01:38:01

+13

reloadテーブルを呼び出すと、アニメーションにリロードセクションが必要なのはなぜですか? (H) 05 8月. 152015-08-05 10:04:19

+3

@dipに同意します。 "reloadData"または "reloadSections"のどちらかを呼び出す必要がありますが、両方を呼び出すことはできません。これで、「beingUpdates」と「endUpdates」の間にちょうど "reloadSections"を使用してランダムにSIGABRTクラッシュを取得します。私はまだ理由を理解しようとしています... 23 12月. 152015-12-23 17:41:07

+4

私は上記のコメントに同意します。 reloadDataまたはreloadSectionsを使用するとどちらも意味をなさない 24 7月. 162016-07-24 09:28:20

  0

numberOfSectionsデリゲート関数を呼び出すために、reloadDataを少なくとも1回は呼び出す必要があると思います。その後、必要に応じてreloadSectionを呼び出すことができます(セクション数が変更されていない間も)。 26 6月. 172017-06-26 15:14:55

  0

reloadDataによってテーブル全体の呼び出し再ロードを解決すると、なぜreloadSectionsを呼び出すのですか? 29 9月. 172017-09-29 10:39:20


2

であるあなたがセクション内の行の既存の番号を更新する前に、いくつかの値と同じでなければならないというエラーを取得している推測クラッシュログが、イムを追加していません。その場合、 テーブルをリロードする前に[self.tableview beginUpdates]を、リロード後に[self.tableview endUpdates]を使用しましたか?

  0

、何のクラッシュログが存在しない、アプリがフリーズし、それは私がして、コードを挟んで試してみた 06 11月. 142014-11-06 02:24:18

  0

をクラッシュしない開始と終了の更新が、何の変化 06 11月. 142014-11-06 02:32:13

  0

試しはここ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND、0を、それを添加しません)、^ {//ここにコードを入れてください}); 06 11月. 142014-11-06 05:26:51

  0

コードが実行されず、アプリがまだフリーズしていると試しました。再度、クラッシュログはありません 06 11月. 142014-11-06 12:06:51

  0

OKをdispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND、0)、^をdispatch_get_main_queue()、 06 11月. 142014-11-06 13:16:52

  0

に変更することでメインスレッドに追加します。同じ結果、アプリがフリーズし、クラッシュログはありません 06 11月. 142014-11-06 14:59:57

  0

提案はありますか? 12 11月. 142014-11-12 06:54:46

+1

これは私の問題を解決しました、ありがとう 03 6月. 152015-06-03 12:05:28