私はマルチセクションテーブルビューを持っています。編集モードでは、あるセクションから別のセクションに行を移動させることができます。 1つのセクションから最後の行が削除されると、そのセクションが削除されます。だから私はmoveRowAtIndexPath内でdeleteSectionを使用しています。セクションの最後の行を移動してセクションを削除すると奇妙なアニメーション
最後の項目をセクションから移動すると、セクションヘッダーが計画通りに消えます。しかし、非常に奇妙なアニメーションバグがあります。移動した行が上にドロップされた行と「マージ」し、空の行が「to」セクションの下部に表示されます(おそらくそのセクションのnumberOfRowsが正しいが、2行は同じ位置にある)。見知らぬ人でも、この行のリオーダーコントロールをクリックすると(アイテムを動かさずに単にタッチして離す)、2つのアイテムは「アンマージ」されます。
私はvideoを掲載しています。
私はデータの変更をラッピングし、変更を開始/終了の更新で表示しようとしましたが、役に立たないものです。
私はテストプロジェクトhereをアップロードしましたが、以下のコードも掲載します。いくつかのポイント:
- データソースのフォーマットをデモプロジェクトで複製しようとしました。問題が発生した場所の場合です。重要なのは、私のソースは2つの他の配列の複合配列です(しかし、なぜこれが問題になるのか分かりません)。
- 問題の動作を確認するには、下部のセクションの2つの行を上部のセクションに移動します。しかし、一番上のセクションの最後の行にドロップしないでください。これはうまくいくようです。
- このデモプロジェクトでは、行を上から下に移動する方法がバグです。
コード(これのすべては、デモプロジェクトである):
私はloadViewメソッドで私の配列を設定します。私はまた、これらの組み合わせを返すメソッドを持っている
- (void)loadView{
array1 = [NSMutableArray array];
[array1 addObject:@"test 0"];
[array1 addObject:@"test 1"];
[array1 addObject:@"test 2"];
array2 = [NSMutableArray array];
[array2 addObject:@"test a"];
[array2 addObject:@"test b"];
[super loadView];
}
配列 - データソースとして使用されます。
- (NSMutableArray *)sourceArray{
NSMutableArray *result = [NSMutableArray array];
if (array1.count > 0) {
[result addObject:array1];
}
if (array2.count >0) {
[result addObject:array2];
}
return result;
}
これは、非常に単純な数のro WS /セクション:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return self.sourceArray.count;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
return [[self.sourceArray objectAtIndex:section] count];
}
スタンダードセル/ヘッダーの書式:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell.textLabel.text = [[self.sourceArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
return cell;
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
return [NSString stringWithFormat:@"Section %i", section];
}
私はあなたの行または何が内側だとオフのチャンスで魔法
// Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
{
NSMutableArray *fromArray = [self.sourceArray objectAtIndex:fromIndexPath.section];
NSMutableArray *toArray = [self.sourceArray objectAtIndex:toIndexPath.section];
NSString *movedObject = [[self.sourceArray objectAtIndex:fromIndexPath.section] objectAtIndex:fromIndexPath.row];
[fromArray removeObject:movedObject];
[toArray insertObject:movedObject atIndex:toIndexPath.row];
if ([self.tableView numberOfRowsInSection: fromIndexPath.section] == 0) {
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:fromIndexPath.section] withRowAnimation:UITableViewRowAnimationFade];
}
}
なぜあなたは-loadViewであなたの配列を設定していますか?プログラムでビューを作成する場合は、-loadViewをオーバーライドする必要があります。いいえ? [super loadView]を呼び出すと、問題のView Controllerと同じ名前のペンがロードされます。配列の設定を-viewDidLoadに移動しないでください。 –
ありがとう - このルールがどこから来たのかについてのリンク/詳細情報はありますか?もちろん、私の質問には役に立たないが、チップに感謝する。 –
の場合は、nibでビューを設定している場合、OSによってloadViewが呼び出されるためです。メソッドのドキュメントでは、このメソッドを直接呼び出さないように明示し、ペン先からビューをロードしている場合はオーバーライドしないように明示しています。 – jmstone617