2

I am using core data and am trying to add table view cells to a table view in a view controller. When I implement it in a table view controller the app runs. When I run it when the table view is part of another view controller, the app does not run. It shows an error in the code: property tableview not found on object of type DeviceViewController. DeviceViewController.h has a table view data source and delegate. My code is:

 #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];
  }
}
4

2 回答 2

0

另一个可能导致崩溃的问题是,当您尝试执行获取请求时,如果您的 NSManagedObjectContext 为 nil。我会if([self managedObjectContext]) 在您的任何视图层次结构方法中使用它之前添加一个。

此外,在使用从故事板实例化的视图时应该小心。Nikola 的回答是在 viewDidLoad 中添加配置视图控制器的代码,只要您没有在界面构建器中将 UITableView 拖到 UIViewController 实例上,就可以了。如果您已经在界面生成器中创建并链接了一个表格视图,您将不必要地用一个新的替换它,所以在 _deviceTableView = [[UITableView alloc] initWithFrame:self.view.frame]; 之前 行,您应该添加一个if(!_deviceTableView) 语句,因为它会阻止您将第二个表视图添加到您的视图中。问题是,如果您已经在 IB 中添加了一个 tableview,即使您更改了 tableview 属性,它也会被您的视图保留,因此可能会显示两个表。

或者,您可以在表视图属性的 getter 方法中使用“延迟实例化”,以确保在访问它时对其进行初始化。

最后,为了帮助我们更好地了解您的应用程序崩溃的原因,从 Xcode 的控制台获取异常日志会很有帮助。

于 2013-06-20T16:30:13.370 回答
0

在我看来,在这种情况下,它与 CoreData 无关。

您应该将UITableViewDataSourceUITableViewDelegate协议添加到您的 VC。之后,您应该创建一个 UITableView(您可以在界面生成器中完成)并将数据源和委托连接到您的视图控制器。

您还可以UITableView在 VC 中添加属性。

当你使用 时UITableViewController,所有这一切都是从 Xcode 完成的,但如果你UITableView在常规中使用,UIViewController你应该注意这些东西。

祝你好运!

编辑:

将此添加为属性

@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

于 2013-06-20T13:42:59.000 回答