2

コア データを使用しており、ビュー コントローラーのテーブル ビューにテーブル ビュー セルを追加しようとしています。テーブルビューコントローラーに実装すると、アプリが実行されます。テーブル ビューが別のビュー コントローラーの一部であるときに実行すると、アプリが実行されません。コードにエラーが表示されます: タイプ DeviceViewController のオブジェクトでプロパティ tableview が見つかりません。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];
  }
}
4

2 に答える 2

0

クラッシュを引き起こす可能性のある別の問題は、フェッチ要求を実行しようとしているときに NSManagedObjectContext が nil である場合です。if([self managedObjectContext]) ビュー階層メソッドのいずれかで使用する前に追加します。

また、ストーリーボードからインスタンス化されたビューを使用する場合も注意が必要です。Nikola の回答では、viewDidLoad でビュー コントローラーを構成するコードを追加するように言われていますが、インターフェイス ビルダーで UIViewController インスタンスに UITableView をドラッグしない限り問題ありません。インターフェースビルダーですでにテーブルビューを作成してリンクしている場合は、不必要に新しいテーブルビューに置き換えることになるため、_deviceTableView = [[UITableView alloc] initWithFrame:self.view.frame]; if(!_deviceTableView) ビューに 2 番目のテーブル ビューを追加できなくなるため、ステートメントを追加する必要があります。問題は、IB に既にテーブルビューを追加している場合、テーブルビュー プロパティを変更した後でもビューによって保持されるため、2 つのテーブルが表示される可能性があることです。

または、テーブル ビュー プロパティの getter メソッドで「遅延インスタンス化」を使用して、アクセス時に確実に初期化されるようにすることもできます。

最後に、アプリがクラッシュする理由をよりよく理解するために、Xcode のコンソールから例外ログを取得すると役立ちます。

于 2013-06-20T16:30:13.370 に答える