Pertanyaan Menggunakan menyisipkan baris dalam UITableView


Saya ingin UITableView saya berperilaku seperti tabel di editor Kontak, yaitu pengguna harus menekan Edit dan baris "tambahkan kategori baru" akan muncul di bagian bawah setiap bagian.

Saya menggunakan kode di bawah untuk melakukan ini, tetapi masalahnya adalah tidak ada transisi yang mulus seperti yang ada dalam Kontak. Sebaliknya, baris baru tiba-tiba muncul. Bagaimana saya bisa mendapatkan animasi?

Juga, bagaimana saya menanggapi klik pada baris "tambahkan kategori baru"? Baris tidak dapat diklik dalam implementasi saya saat ini.

Apakah saya perlu memuat ulang data saat pengguna mulai mengedit? Saya melakukan ini karena jika tidak baris penyisipan tidak pernah diambil.

Terima kasih.

- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
    [super setEditing:editing animated:animated];
    [self.tableView setEditing:editing animated:animated];
    [tableView reloadData];
}

- (NSInteger)tableView:(UITableView *)_tableView numberOfRowsInSection:(NSInteger)section {
    // ...
    if( self.tableView.editing ) 
        return 1 + rowCount;
}

- (UITableViewCell *)tableView:(UITableView *)_tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    // .....
    NSArray* items = ...;
    if( indexPath.row >= [items count] ) {
        cell.textLabel.text = @"add new category";
    }
    // ...

    return cell;
}

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSArray* items = ...;

    if( indexPath.row == [items count] )
        return UITableViewCellEditingStyleInsert;

    return UITableViewCellEditingStyleDelete;
}

32
2017-09-24 10:44


asal


Jawaban:


Saya kehilangan satu hal. Di setEditing :, alih-alih memanggil reloadData yang seharusnya saya lakukan:

- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
    [super setEditing:editing animated:animated];
    [self.tableView setEditing:editing animated:animated]; // not needed if super is a UITableViewController

    NSMutableArray* paths = [[NSMutableArray alloc] init];

    // fill paths of insertion rows here

    if( editing )
        [self.tableView insertRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationBottom];
    else
        [self.tableView deleteRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationBottom];

    [paths release];
}

36
2017-09-25 00:30



Menanggapi klik pada baris mungkin dilakukan di didSelectRowAtIndexPath metode, untuk indexPath.row == [items count]. Untuk animasi, saya sarankan untuk melihatnya sini, pada insertRowsAtIndexPaths:withRowAnimation: metode. Ada posting tentang cara menggunakannya sini.


5
2017-09-24 20:50



Efek samping yang tidak diinginkan dari solusi yang disorot adalah bahwa baris "tambah" dimasukkan juga ketika pengguna hanya menggesek satu baris (asalkan menggesek diaktifkan). Kode berikut memecahkan dilema ini:

// Assuming swipeMode is a BOOL property in the class extension.

- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Invoked only when swiping, not when pressing the Edit button.
    self.swipeMode = YES;
}

- (void)tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
    self.swipeMode = NO;
}

Kode Anda akan membutuhkan perubahan kecil:

- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
    [super setEditing:editing animated:animated];
    [self.tableView setEditing:editing animated:animated]; // not needed if super is a UITableViewController

    if (!self.swipeMode) {

        NSMutableArray* paths = [[NSMutableArray alloc] init];

        // fill paths of insertion rows here

        if( editing )
            [self.tableView insertRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationBottom];
        else
            [self.tableView deleteRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationBottom];
        [paths release];
    }
}

0
2018-02-23 15:14