Sel Khusus di UITableView tidak akan dimuat ulang dengan benar setelah data dalam sel diubah

Saya telah membuat sel khusus di UITableView. Gaya diatur ke Kustom. Pengidentifikasi diatur ke customCell. Aksesori diatur ke Detail. Konten Tampilan Tabel diatur ke Prototipe Dinamis.

Tabel dimuat dengan data dari data inti dan muncul dengan sempurna saat pertama kali muncul. Saat pengguna mengetuk ikon detail di sel, tampilan baru akan muncul sehingga pengguna dapat mengedit data di sel dan menyimpannya ke data inti. Ketika pengguna selesai mengedit dan mengetuk tombol Simpan, tampilan kembali ke UITableView tetapi sel yang baru saja diedit muncul sebagai sel 'Dasar' dan bukan sel khusus. Jika saya mengetuk sel, sel tersebut akan disorot dan konten sel khusus muncul DI ATAS konten sel dasar.

Sepertinya saya tidak bisa menyelesaikan ini. Adakah yang bisa menyarankan sesuatu?

Berikut adalah bagian prepareForSegue yang dikirimkan ke pengontrol tampilan pengeditan:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(UITableViewCell*)sender {

if ([[segue identifier]isEqualToString:@"editPunchItemSegue"]) {
// DEFINE SEGUE DESTINATION
UINavigationController *navigationController = segue.destinationViewController;
EditPunchItemViewController *editPunchItemViewController = (EditPunchItemViewController*)navigationController.topViewController;

NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
Punchitem *editPunchItem = (Punchitem*)[self.fetchedResultsController objectAtIndexPath:indexPath];

editPunchItemViewController.editPunchitem = editPunchItem;

Dan sekarang, di View Controller tujuan, tempat data inti diedit, berikut adalah bagian dari metode saveButtonPressed:

 if  ([_editSaveButton.title isEqualToString:@"Save"]) {
    NSLog(@"Save Button has been PRESSED");

    editPunchitem.punchitemRoomNumber = _editPunchitemRoomNumberField.text;
    editPunchitem.punchitemDescription = _editPunchitemDescriptionField.text;
    editPunchitem.punchitemLocation = _editPunchitemLocationField.text;
    editPunchitem.punchitemRoomName = _editPunchitemRoomNameField.text;
    editPunchitem.punchitemDate = _editPunchitemDateField.text;

    // SAVE TO MANAGE OBJECT CONTEXT!
    [super saveAndDismiss];
}

Ada saran?

Ini cellForRowAtIndex saya di TableViewController

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"Running %@ '%@'", self.class, NSStringFromSelector(_cmd));

    static NSString *CellIdentifier = @"customCell";

//  USING CUSTOM PROTOTYPE CELL:
    CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // Configure the cell...
    Punchitem *punchitem = [self.fetchedResultsController objectAtIndexPath:indexPath];

//  USING CUSTOM PROTOTYPE CELL:
    cell.cellLocationLabel.text = punchitem.punchitemLocation;
    cell.cellDescriptionLabel.text = punchitem.punchitemDescription;
    cell.cellRoomNameLabel.text = punchitem.punchitemRoomName;

    return cell;
}

Simpan dan tutup adalah bagian dari subkelas. Inilah caranya:

-(void) saveAndDismiss {

    NSError *error = nil;
    if ([self.managedObjectContext hasChanges]) {
        if (![self.managedObjectContext save:&error]) {  //SAVE FAILED
            NSLog(@"YOUR SAVE FAILED! %@", [error localizedDescription]);
        } else {
            NSLog(@"SAVE SUCCEEDED!");
        }
    }

    [self dismissViewControllerAnimated:YES completion:nil];
}

person Jupiter869    schedule 02.03.2014    source sumber
comment
apa yang dilakukan simpan dan tutup, dan tolong tunjukkan cellAtRowIndex, sepertinya ada sesuatu yang menimpa storyboard Anda   -  person meda    schedule 02.03.2014
comment
Saya baru saja menambahkan cellForRowAtIndex saya di postingan asli saya   -  person Jupiter869    schedule 02.03.2014
comment
Coba gunakan sel prototipe xib.   -  person Oleg Sobolev    schedule 03.03.2014
comment
solusi yang sangat bagus ditemukan untuk ini di obrolan.   -  person Sameeksha Kumari    schedule 15.06.2014


Jawaban (4)


apakah Anda mencoba memuat ulang tabel ketika Anda kembali dari EditPunchItemViewController ?

masukkan ke dalam viewController utama:

- (void)viewWillAppear:(BOOL)animated {
   if (self.tableView) {
        [self.tableView reloadData];
    }
}
person Armand DOHM    schedule 02.03.2014
comment
Ya, saya memiliki baris itu di viewWillAppear TableViewController saya. Sayangnya, itu tidak membantu. - person Jupiter869; 02.03.2014

Apakah Anda mengalami hal seperti ini

[self.tableView beginUpdates];

Jika ya, apakah Anda yakin untuk menelepon ini setelah selesai

[self.tableView endUpdates];

Seringkali kami menggunakan ini dengan NSFetchedResultsController...

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
    [self.tableView beginUpdates];
}
...
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    [self.tableView endUpdates];
}
person Armand DOHM    schedule 02.03.2014
comment
Ya, terima kasih atas saran ini, tetapi saya sudah menyertakan kedua metode ini dalam kode saya. - person Jupiter869; 02.03.2014

Opsi terakhir, Anda harus melakukan debug bersyarat...

Semua di ViewController Utama Anda:

1) tambahkan properti

@property (strong,nonatomic) NSIndexPath *DEBUGindexPath;

2) setel DEBUGindexPath ke dalam

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(UITableViewCell*)sender {

if ([[segue identifier]isEqualToString:@"editPunchItemSegue"]) {
...
NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
DEBUGindexPath = indexPath;
...

3) Tambahkan BreakPoint di

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

Edit breakpoint untuk mengatur kondisi:

(self.DEBUGindexPath.row == indexPath.row) && (self.DEBUGindexPath.section == indexPath.section)

Jangan atur Lanjutkan otomatis...

Oke, sekarang jalankan aplikasi Anda. Saat Anda kembali dari EditPunchItemViewController, titik henti sementara akan terpicu hanya untuk baris yang dipilih. Lakukan langkah demi langkah untuk memeriksa apakah Anda dapat menemukan sesuatu

person Armand DOHM    schedule 02.03.2014

tampilan kembali ke UITableView tetapi sel yang baru saja diedit muncul sebagai sel 'Dasar' dan bukan customCell.

Perhatikan cellForRowAtIndexPath baik-baik, kondisi berikut:

    //USING CUSTOM PROTOTYPE CELL:
    CustomTableViewCell *cell =
                    [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[CustomTableViewCell alloc]
                             initWithStyle:UITableViewCellStyleDefault 
                           reuseIdentifier:CellIdentifier];
    }

Ketika selnya nihil, Anda menyetel gayanya ke UITableViewCellStyleDefault tetapi Anda lupa menyetel jenis aksesorinya melalui kode.

Jadi pastikan mengatur jenis aksesorinya dalam pernyataan if seperti ini:

    //USING CUSTOM PROTOTYPE CELL:
    CustomTableViewCell *cell =
                    [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[CustomTableViewCell alloc]
                             initWithStyle:UITableViewCellStyleDefault 
                           reuseIdentifier:CellIdentifier];
        //Set accessory to Detail
        cell.accessoryType = UITableViewCellAccessoryDetailButton;
    }

Berikut daftar lengkap gayanya:

typedef enum : NSInteger {
   UITableViewCellAccessoryNone,
   UITableViewCellAccessoryDisclosureIndicator,
   UITableViewCellAccessoryDetailDisclosureButton,
   UITableViewCellAccessoryCheckmark,
   UITableViewCellAccessoryDetailButton
} UITableViewCellAccessoryType;
person meda    schedule 02.03.2014
comment
Saya tidak mengerti. Saya menggunakan sel khusus. Saat tampilan tabel dimuat, saya mendapatkan tampilan Dasar, bukan tampilan kustom saya. Di mana saya menambahkan baris cell.accessoryType = UITableViewCellAccessoryDetailButton untuk memastikan sel khusus yang muncul dan bukan sel dasar? Haruskah saya menggunakan sesuatu selain UITableViewCellStyleDefault? - person Jupiter869; 03.03.2014
comment
@ Jupiter869 Maaf saya kurang jelas, lihat hasil edit saya - person meda; 03.03.2014
comment
Sayangnya, hal ini tidak berpengaruh. Saat saya kembali dari EditView ke TableView, sel tersebut muncul sebagai sel Dasar dengan satu baris data di dalamnya, bukan CustomCell yang telah saya siapkan di storyboard. Jika saya mengeklik sel, sel tersebut akan disorot dan 'Basic' dan 'customCell muncul di atas satu sama lain. Tampaknya sel 'Basic' berada di ATAS 'customCell'. Ini membingungkan dan sangat membuat saya frustrasi. - person Jupiter869; 03.03.2014
comment
Gambar ini menampilkan tableView saat pemuatan pertama: imgur.com/sPoazwi - Gambar berikutnya menampilkan tableView setelah pemuatan kedua sel telah diedit. Perhatikan bahwa sel menampilkan format sel Dasar: imgur.com/TSFct3J - Gambar terakhir menunjukkan apa yang terjadi ketika saya mengklik sel kedua. CustomCell muncul di atas sel Dasar: imgur.com/uHtSoon - person Jupiter869; 03.03.2014
comment
@ Jupiter869 Anda menggunakan sel prototipe? - person meda; 03.03.2014
comment
tableView saya disetel ke Prototipe Dinamis di Storyboard - person Jupiter869; 03.03.2014
comment
mari kita melanjutkan diskusi ini di chat - person meda; 03.03.2014