4

これは私の前の質問に似ていますが、私の前の質問は実際にはある程度答えられており、これはその延長のようなものです。

UITableView編集モードに切り替えたり、編集モードから外したりしています。編集モードで、挿入アイコンを含む追加の行を表示します。私のデータ ソースからの他のすべての行は、削除アイコンで表示されます。

何らかの理由で、編集モードを終了すると、データ ソースの最後の行が他のすべての行と同じようにアニメーション化されません。これは、動作に基づいて、明らかなコードの問題のように見えますが、修正できないようです。私が話していることを示すために、アニメーション GIF を作成しました。

なぜこれが起こっているのか誰にも分かりますか?これは常に、データ ソースの最後の行です。カスタム挿入行のアイコンはうまくアニメーション化されます。大量のコードではありませんが、すべてを一度に表示するのが最も簡単なので、Github の正確なコードにリンクします。

https://github.com/ryancole/pound-client/blob/master/pound-client/controllers/ChannelListViewController.m#L100

4

3 に答える 3

0
#import <UIKit/UIKit.h>

@interface zViewController : UIViewController

@property (weak, nonatomic) IBOutlet UITableView *table;
@end



#import "zViewController.h"

@interface zViewController ()
@property (nonatomic, retain) NSArray* data;
@end

@implementation zViewController{
    BOOL _editing;
}
@synthesize data = _data;
@synthesize table = _table;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        _editing = NO;
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Edit" style:UIBarButtonItemStyleBordered target:self action:@selector(editButtonWasPressed:)];
    [self loadRecords];
}

- (void)editButtonWasPressed:(id)sender {
    self.navigationItem.leftBarButtonItem  = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleBordered target:self action:@selector(saveButtonWasPressed:)];
    [self setEditing:YES animated:YES];
}

- (void)saveButtonWasPressed:(id)sender {
    self.navigationItem.leftBarButtonItem  = [[UIBarButtonItem alloc] initWithTitle:@"Edit" style:UIBarButtonItemStyleBordered target:self action:@selector(editButtonWasPressed:)];
    [self setEditing:NO animated:YES];
}
- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
    _editing = editing;

    if (editing == YES) {
        [self.table insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:self.data.count -1 inSection:0]] withRowAnimation:UITableViewRowAnimationNone];
    }

    [super setEditing:editing animated:animated];
    [self.table setEditing:editing animated:animated];

    if (editing == NO) {
        [self.table deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:self.data.count inSection:0]] withRowAnimation:UITableViewRowAnimationNone];
    }
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    [self fetchChannels];
}

- (void)fetchChannels {
    [self.table reloadData];
}

-(void) loadRecords{
    self.data = @[@"Record 1", @"Record 2", @"Record 3"];
}


#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
    return (indexPath.row == self.data.count)? UITableViewCellEditingStyleInsert : UITableViewCellEditingStyleDelete;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return _editing? self.data.count + 1 : self.data.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    cell.textLabel.text = self.data[indexPath.row];
    return cell;
}
@end
于 2013-01-22T21:56:18.893 に答える
0

問題は tableView またはそれに関連するコードにはないようです。ビューを更新するためのプルが原因のようです。残念ながら、そのコンポーネントのコードはありません。引っ張らずにリフレッシュしてみましたが、完璧に機能しています。したがって、プルを削除して更新し、何が起こっているかを確認してください。

于 2013-01-22T01:54:36.547 に答える
0

アニメーションは正しいです。の最後の行を挿入/削除し-setEditing:animated:ているため、2 種類のアニメーションが実行されています。

于 2013-01-22T23:02:26.070 に答える