2013-06-23 1 views
0

Я создаю приложение, которое использует основные данные. Я добавляю пользовательские ячейки таблицы просмотра и сохраняю их порядок. Я сделал это для одного вида таблицы. Однако у меня есть несколько табличных представлений, и я не знаю, что изменить в коде, чтобы он работал для других табличных представлений. У меня есть модель данных с объектом, называемым устройством. В нем есть строка, называемая «имя». Мне нужно знать, как отредактировать код, чтобы сделать его совместимым для других табличных представлений. Мой код выглядит следующим образом. DeviceViewController.m:Дублирование VC с аналогичным кодом с использованием данных ядра

@interface DeviceViewController() 
@property (strong) NSMutableArray *devices; 
@end 

@implementation DeviceViewController 

- (NSManagedObjectContext *)managedObjectContext { 
    NSManagedObjectContext *context = nil; 
id delegate = [[UIApplication sharedApplication] delegate]; 
if ([delegate performSelector:@selector(managedObjectContext)]) { 
    context = [delegate managedObjectContext]; 
} 
return context; 
} 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
if (self) { 
    // Custom initialization 
} 
return self; 
} 
- (void)viewDidLoad 
{ 
[super viewDidLoad]; 

// Uncomment the following line to preserve selection between presentations. 
// self.clearsSelectionOnViewWillAppear = NO; 

// Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
// self.navigationItem.rightBarButtonItem = self.editButtonItem; 
} 

- (void)viewDidAppear:(BOOL)animated 
{ 
[super viewDidAppear:animated]; 

// Fetch the devices from persistent data store 
NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Device"]; 
self.devices = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy]; 

[self.tableView reloadData]; 
} 

- (void)didReceiveMemoryWarning 
{ 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
} 

#pragma mark - Table view data source 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
// Return the number of sections. 
return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
// Return the number of rows in the section. 
return self.devices.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
static NSString *CellIdentifier = @"Cell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

// Configure the cell... 
NSManagedObject *device = [self.devices objectAtIndex:indexPath.row]; 
[cell.textLabel setText:[NSString stringWithFormat:@"%@ ", [device valueForKey:@"name"]]]; 

return cell; 
} 


- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
// Return NO if you do not want the specified item to be editable. 
return YES; 
} 


- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
NSManagedObjectContext *context = [self managedObjectContext]; 

if (editingStyle == UITableViewCellEditingStyleDelete) { 
    // Delete object from database 
    [context deleteObject:[self.devices objectAtIndex:indexPath.row]]; 

    NSError *error = nil; 
    if (![context save:&error]) { 
     NSLog(@"Can't Delete! %@ %@", error, [error localizedDescription]); 
     return; 
    } 

    // Remove device from table view 
    [self.devices removeObjectAtIndex:indexPath.row]; 
    [self. tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
} 
} 

#pragma mark - Table view delegate 




#pragma mark - Segue 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
if ([[segue identifier] isEqualToString:@"UpdateDevice"]) { 
    NSManagedObject *selectedDevice = [self.devices objectAtIndex:[[self.tableView indexPathForSelectedRow] row]]; 
    DeviceDetailViewController *destViewController = segue.destinationViewController; 
    destViewController.device = selectedDevice; 
} 
} 

@end 

DeviceDetailViewController.m:

@interface DeviceDetailViewController() 

@end 

@implementation DeviceDetailViewController 
@synthesize device; 

- (NSManagedObjectContext *)managedObjectContext { 
NSManagedObjectContext *context = nil; 
id delegate = [[UIApplication sharedApplication] delegate]; 
if ([delegate performSelector:@selector(managedObjectContext)]) { 
    context = [delegate managedObjectContext]; 
} 
return context; 
} 

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

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
// Do any additional setup after loading the view. 
if (self.device) { 
    [self.nameTextField setText:[self.device valueForKey:@"name"]]; 

} 

} 

- (void)didReceiveMemoryWarning 
{ 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
} 

- (IBAction)cancel:(id)sender { 
[self dismissViewControllerAnimated:YES completion:nil]; 
} 

- (IBAction)save:(id)sender { 
NSManagedObjectContext *context = [self managedObjectContext]; 

if (self.device) { 
    // Update existing device 
    [self.device setValue:self.nameTextField.text forKey:@"name"]; 


} else { 
    // Create a new device 
    NSManagedObject *newDevice = [NSEntityDescription insertNewObjectForEntityForName:@"Device" inManagedObjectContext:context]; 
    [newDevice setValue:self.nameTextField.text forKey:@"name"]; 

} 

NSError *error = nil; 
// Save the object to persistent store 
if (![context save:&error]) { 
    NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]); 
} 

[self dismissViewControllerAnimated:YES completion:nil]; 
} 
@end 
+0

С вашего вопроса неясно, что не работает. Вы должны рассказать нам, а не просто сбросить код и дать понять. – Mundi

+0

Мне нужно еще четыре таких VC, но это сбой, когда я его создаю. Мне нужно иметь возможность использовать один и тот же код во всех четырех экземплярах. С необходимыми изменениями. Мне нужно знать, какие изменения в коде мне нужно сделать –

+0

Очевидно, вы не можете сказать нам, что не работает. В этом случае будет сложно получить ответ. – Mundi

ответ

0
  • Заменитель имя сущности с именем объекта вам нужно.
  • Соответствующий тип класса для этого объекта.
  • Замените имена свойств соответствующими именами свойств.
  • Убедитесь, что свойство объекта контроллера подробного представления имеет нужный тип.
  • Измените вещи выше и в контроллере подробного представления.

Кстати, вам не нужно постоянно повторять код, создающий контекст управляемого объекта. Вы можете перейти к контексту через объект, если он у вас есть (как вы это делаете в подробном представлении):

+0

Извините, что спросить, но что такое имя объекта? –

+0

Это было бы, скажем, «Владелец» вместо «Устройство». Предположительно, вы показываете различные типы управляемых объектов в других контроллерах представлений. – Mundi

+0

Должен ли я иметь разные строки в сущности? Один для каждого VC? –