2013-06-20 2 views
2

Я использую данные ядра и пытаюсь добавить ячейки таблицы таблицы в представление таблицы в контроллере представления. Когда я реализую его в контроллере табличного представления, приложение запускается. Когда я запускаю его, когда представление таблицы является частью другого контроллера представления, приложение не запускается. Он показывает ошибку в коде: свойство tableview не найдено на объекте типа DeviceViewController. DeviceViewController.h имеет источник данных и делегат с представлением таблицы. Мой код:Вид таблицы в контроллере представления с использованием данных ядра

#import "DeviceViewController.h" 
#import "DeviceDetailViewController.h" 

@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]; 

// 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. otableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]   withRowAnimation:UITableViewRowAnimationFade]; 
    } 
} 

ответ

0

Как я вижу, в этом случае он не имеет ничего общего с CoreData.

Вы должны добавить протоколы UITableViewDataSource и UITableViewDelegate к вашему VC. После этого вы должны создать UITableView (вы можете сделать это в построителе интерфейса) и подключить источник данных и делегировать его к контроллеру представления.

Вы также можете добавить свой объект для UITableView в ваш VC.

Когда вы используете UITableViewController, все это делается с Xcode, но если вы используете UITableView внутри обычного UIViewController, вам следует позаботиться об этом.

Удачи!

EDIT:

Добавить это как СОБСТВЕННОСТИ

@property (nonatomic, strong) UITableView *deviceTableView; 

Изменение viewDidLoad метод следующим образом:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    _deviceTableView = [[UITableView alloc] initWithFrame:self.view.frame]; 
    _deviceTableView.delegate = self; 
    _deviceTableView.dataSource = self; 
    [self.view addSubview:_deviceTableView]; 
    [_deviceTableView reloadData]; 
} 

Удалить то, что вы написали в viewDidAppear и заменить self.tableView с _deviceTableView везде этот файл.

+0

Я сделал это, но он сбой, когда он загружается. Отображение ошибки SIGBART –

+0

Какое сообщение об исключении вы получаете? –

+0

Я изменил некоторые вещи и добавил это к моей функции viewdidappear: DeviceViewController * deviceViewController = [[DeviceViewController alloc] init]; deviceViewController.tableView = self.tableView; self.tableView.dataSource = deviceViewController; self.tableView.delegate = deviceViewController; Теперь он показывает точку останова на [self.tableView reloadData]; –

0

Другой проблемой, которая может быть причиной сбоев, является то, что ваш NSManagedObjectContext равен нулю, когда вы пытаетесь выполнить запрос на выборку. Я хотел бы добавить if([self managedObjectContext]) , прежде чем использовать его в любом из методов иерархии вашего представления.

Кроме того, вы должны быть осторожны при использовании представлений, созданных из раскадровки. Ответ Никола сказал, добавив код, настраивающий контроллер представления в viewDidLoad, и это нормально, если вы не перетащили UITableView на свой экземпляр UIViewController в конструкторе интерфейса. Если вы уже создали и связали табличное представление в построителе интерфейса, вы будете бесполезно заменять его на новый, поэтому перед _deviceTableView = [[UITableView alloc] initWithFrame: self.view.frame]; , вы должны добавить оператор if(!_deviceTableView) , потому что он не позволит вам добавить второй вид таблицы к вашему представлению. Проблема в том, что если вы уже добавили табличное представление в IB, оно будет сохранено по вашему мнению даже после изменения вашего свойства tableview, поэтому можно отобразить две таблицы.

В качестве альтернативы вы можете использовать «ленивый экземпляр» в методе getter для свойства вида таблицы, чтобы убедиться, что он инициализируется при его доступе.

И наконец, чтобы помочь нам лучше понять, почему ваше приложение разбивается, было бы полезно получить журнал исключений с консоли в Xcode.

+0

Я думаю, проблема в том, что NSManagedObjectContext выполняет запрос на выборку, не могли бы вы рассказать мне, какой код писать. –

+0

Я знаю, что что-то не так с функцией viewdidappear, я просто не знаю, что и как его изменить, не могли бы вы мне помочь –

+0

Еще несколько вещей, которые я заметил в функции viewDidAppear, ни одна из них не может быть напрямую связана с crash, но они все равно проблемы, которые вы, вероятно, захотите исправить. Во-первых, в вашем получателе managedObjectContext вы вызываете 'if ([delegate performSelector: @selector (managedObjectContext)]), когда вы, вероятно, захотите' responsesToSelector: 'вместо этого, поскольку performSelector все равно сделает ваше приложение аварийным, если оно не существует. Во-вторых, когда запрос на выборку используется для представления таблицы, вы должны использовать дескриптор сортировки, чтобы объекты возвращались в том же порядке каждый раз, когда вы его выполняете. – mrosales

Смежные вопросы