2010-11-20 17 views
0

Bir ListViewController, bir DetailViewController ve bir DüzenlemeControlleri ile düzenlenmiş bir Çekirdek Verileri uygulamasına sahibim. ListViewController, ben bir onay kutusu ilişkin bir grafik var ve benim seçim kalıcı kılmak, böylece benWindowsController'da temel verileri düzenleyebilir

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

yılında satır seçerek iki görüntü değişimi yapar o ListViewController gelen Çekirdek Veri kaydını düzenlemek mümkün mü ? Sadece doğrudan yanlış olana geçiş yapacak olan değeri seçmek, düzenlemek ve kaydetmek için sözdizimini çalışamıyorum.

jon

Hızlı yanıt için teşekkürler! Cevap 1'den sonraki ek bilgiler. Bu uygulamayı CoreData Books örneğinde modelliyorum. Düğme kullanmıyorum, ancak kontrol edilen ve işaretlenmemiş bir onay kutusu oluşturmak için iki görüntü kullanıyorum. Varlığım için bir boolean "check" ekledim, üstbilgi dosyasını yeniden oluşturdum ve header dosyasını ListViewController'ımma ekledim. İşte datamodel başlık dosyasının basitleştirilmiş bir sürümüdür.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; 

    NSManagedObject *entityObject = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
    if (![entityObject.check boolValue]) { 
     entityObject.check = [NSNumber numberWithBool:YES]; 
     cell.imageView.image = [UIImage imageNamed:@"check.png"]; 
     } 
    else { 
     entityObject.check= [NSNumber numberWithBool:NO]; 
     cell.imageView.image = [UIImage imageNamed:@"uncheck.png"]; 
    } 

Ancak bu "şey değil bir yapıya veya birliktelik 'kontrol' üyesi için İsteği" Bana hata veriyor:

@interface Patient : NSManagedObject 
{ 
} 

@property (nonatomic, retain) NSString * location; 
@property (nonatomic, retain) NSNumber * check; 
@property (nonatomic, retain) NSString * lastName; 

@end 

Ve burada kod benim değişikliktir. Yeni özniteliğin bir boolean olduğunu ve üstbilgi dosyasının ListViewController'a aktarıldığını doğruladım. Düşüncesi olan var mı?

Son olarak, bu kod veritabanına entityObject.check kaydetme gereksinimini ortadan kaldırıyor mu? Tekrar teşekkürler.

+0

özel nesne modeli sınıfları kendi ilan etmedik olduğundan, almak ve sırasıyla aşağıdaki kullanarak onların değerlerini ayarlayabilirsiniz: kullanılmasını ayarlamak için [EntityObject SetValue: [NSNumber numberWithBool: EVET] forKey: @ "check" ] ve [entityValue valueForKey: @ "kontrol edin"] – Rog

+0

Son satırdaki değerValue değerini okuduğu için üzgünüm, bunu çözmediyseniz, entityObject olmalıdır. – Rog

+0

iPhone'da onay kutusu düğmelerine dikkat etmek istersiniz. Kullanıcılar, hata oluşturmaya iki kez dokunma eğilimindedir. Bu nedenle, slayt anahtarı kontrolü, kullanıcıların ikili durumları kolayca ve hızlı bir şekilde ayarlayabilmeleri için oluşturulmuştur. – TechZen

cevap

1

Daha bilinçli bir öneride bulunmadan önce uygulamanızın ne yaptığıyla ilgili birkaç ayrıntı daha almak güzel olurdu. Eğer yardım edip edemeyeceğimi görmek için birkaç varsayım yapacağım ...

İlk olarak, Coredata'daki BOOL özellikleriyle uğraşırken, aslında NSNumbers olarak kaydedildiğini hatırlamanız önemlidir, böylece ihtiyacınız olduğunda bunu aklınızda bulundurun. Değerlerini test etmek ve doğru yöntemleri kullandığınızdan emin olmak için. senin ListViewController verileri varsayarsak

CoreData tarafından doldurulur alınıyor ve veri modeli burada, "favori" olarak adlandırılan BOOL bir özelliği olan bir varlık "Varlık" tanımlar deneyebileceğiniz ne:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

     NSManagedObject *entityObject = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
     if (![entityObject.favourite boolValue]) { 
      entityObject.favourite = [NSNumber numberWithBool:YES]; 
      [self.yourToggleButton setSelected:YES]; // this assumes your checkbox is a UIButton and you want its view to be updated to checked when your BOOL == YES 
     } 
     else { 
      entityObject.favourite = [NSNumber numberWithBool:NO]; 
      [self.watchListButton setSelected:NO]; 
     } 

Yukarıdaki veriler, CoreData veritabanınızdan da veri almak için bir fetchedResultsController sahip olduğunuzu varsayar. Eğer olmasa da, Apple'ın (CoreData Books ve CoreData Recipes) öğreticilerinden, hayatınızı nasıl daha kolay hale getireceklerini öğrenmek için bir öneride bulunmanızı şiddetle tavsiye ediyorum - NSFetchedResultsController, verilerinizi farklı görünümler arasında senkronize halde tutmak için oldukça basit bir yöntemdir. Farklı görünüm denetleyicilerinde farklı özniteliklerin düzenlenmesine izin verdiğiniz için özel olarak düşünmeniz gereken bir şey.

Umarım bu yardımcı olur, ancak ihtiyacınız olursa herhangi bir ek soru sormaya çekinmeyin. Şerefe, Rog

+1

Yukarıdaki soruya eke bakın. Jon – jon

+0

Özelleştirilmiş bir nesne modeli sınıfları bildirmediğiniz için, sırasıyla aşağıdakileri kullanarak değerlerini alabilir ve ayarlayabilirsiniz: [entityObject setValue: [NSNumber numberWithBool: YES] forKey: @ "check"] işlevini ayarlamak [entityObject valueForKey: @ "check"] – Rog

+0

Aşağıdaki çözümüme bakın. – jon

0

Biraz farklı bir çözüm buldum, ama Rog'un yazısı beni kesinlikle doğru yolda buldu. Boole sözdizimi ile ilgili bir sorun yaşadım, bu yüzden varlık özniteliğini bir dizgiye dönüştürdüm ve bunun yerine "N" ve "Y" yi kullandım. Kalıcı hale getirmek için değeri kaydetmem gerektiğini de öğrendim. Yardımı takdir ediyorum.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    // Establish connections 
    NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext]; 
    Patient *patient = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; 

    // Toggle images and check value with each row tap 
    if ([patient.check isEqualToString: @"N"] == YES) { 
     cell.imageView.image = [UIImage imageNamed:@"check.png"]; 
     patient.check = @"Y"; 
    } 
    else { 
     cell.imageView.image = [UIImage imageNamed:@"uncheck.png"]; 
     patient.check = @"N"; 
    } 

    // Save check value 
    NSError *error = nil; 
    if (![context save:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 
} 
İlgili konular