2017-07-02 91 views
0

我正在學習一個教程來學習核心數據存儲和檢索。以下是我的表格視圖代碼。[AppDelegate managedObjectContext]:無法識別的選擇器發送到實例

#import "DeviceViewController.h" 
#import <CoreData/CoreData.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; 
} 
- (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 1; 
} 

-(NSInteger)tableView:(UITableView *) tableView numberOfRowsInSection:(NSInteger) section{ 
    return self.devices.count; 
} 

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

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

我在創建項目時選中了核心數據的複選框,但出現以下錯誤。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[AppDelegate managedObjectContext]: unrecognized selector sent to instance 0x60800003c200' 
*** First throw call stack: 
(
    0 CoreFoundation      0x0000000107ab8d4b __exceptionPreprocess + 171 
    1 libobjc.A.dylib      0x00000001070f921e objc_exception_throw + 48 
    2 CoreFoundation      0x0000000107b28f04 -[NSObject(NSObject) doesNotRecognizeSelector:] + 132 
    3 CoreFoundation      0x0000000107a3e005 ___forwarding___ + 1013 
    4 CoreFoundation      0x0000000107a3db88 _CF_forwarding_prep_0 + 120 
    5 MyStore        0x0000000106b1ff80 -[DeviceViewController managedObjectContext] + 128 
    6 MyStore        0x0000000106b20058 -[DeviceViewController viewDidAppear:] + 88 
    7 UIKit        0x0000000108084a6c -[UIViewController _setViewAppearState:isAnimating:] + 945 
    8 UIKit        0x00000001080b98d7 -[UINavigationController viewDidAppear:] + 207 
    9 UIKit        0x0000000108084a6c -[UIViewController _setViewAppearState:isAnimating:] + 945 
    10 UIKit        0x00000001080877da __64-[UIViewController viewDidMoveToWindow:shouldAppearOrDisappear:]_block_invoke + 42 
    11 UIKit        0x0000000108085ac4 -[UIViewController _executeAfterAppearanceBlock] + 86 
    12 UIKit        0x0000000107ee977c _runAfterCACommitDeferredBlocks + 653 
    13 UIKit        0x0000000107ed6273 _cleanUpAfterCAFlushAndRunDeferredBlocks + 566 
    14 UIKit        0x0000000107ef9757 __84-[UIApplication _handleApplicationActivationWithScene:transitionContext:completion:]_block_invoke_2 + 194 
    15 CoreFoundation      0x0000000107a5d6ac __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12 
    16 CoreFoundation      0x0000000107a426f4 __CFRunLoopDoBlocks + 356 
    17 CoreFoundation      0x0000000107a41e65 __CFRunLoopRun + 901 
    18 CoreFoundation      0x0000000107a41884 CFRunLoopRunSpecific + 420 
    19 GraphicsServices     0x000000010b952a6f GSEventRunModal + 161 
    20 UIKit        0x0000000107edcc68 UIApplicationMain + 159 
    21 MyStore        0x0000000106b2132f main + 111 
    22 libdyld.dylib      0x000000010a9ae68d start + 1 
    23 ???         0x0000000000000001 0x0 + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 

我是在物鏡c中使用coreData的新手。我已經搜索了徹底的堆棧和互聯網,但無法找到解決方案。

編輯:我AppDelegate.m是遵循

#import "AppDelegate.h" 
#import <CoreData/CoreData.h> 

@interface AppDelegate() 

@end 

@implementation AppDelegate 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    return YES; 
} 
#pragma mark - Core Data stack 

@synthesize persistentContainer = _persistentContainer; 

- (NSPersistentContainer *)persistentContainer { 
    // The persistent container for the application. This implementation creates and returns a container, having loaded the store for the application to it. 
    @synchronized (self) { 
     if (_persistentContainer == nil) { 
      _persistentContainer = [[NSPersistentContainer alloc] initWithName:@"MyStore"]; 
      [_persistentContainer loadPersistentStoresWithCompletionHandler:^(NSPersistentStoreDescription *storeDescription, NSError *error) { 
       if (error != nil) { 
        NSLog(@"Unresolved error %@, %@", error, error.userInfo); 
        abort(); 
       } 
      }]; 
     } 
    } 

    return _persistentContainer; 
} 

#pragma mark - Core Data Saving support 

- (void)saveContext { 
    NSManagedObjectContext *context = self.persistentContainer.viewContext; 
    NSError *error = nil; 
    if ([context hasChanges] && ![context save:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, error.userInfo); 
     abort(); 
    } 
} 

@end 

正如我所說的,我下面這個教程,並有在AppDelegate類沒有變化。

+2

的信息是相當清楚的;你的'AppDelegate'類沒有函數或屬性'managedObjectContext' - 你如何在你的AppDelegate中設置你的核心數據棧? – Paulw11

+0

你有一個「新」模板的應用程序,但也許是以下一些舊的教程。你應該使用'appDelegate.persistentContainer.viewContext' – Paulw11

+0

你可以舉例代碼請 – shamila

回答

1

您的代碼有兩個問題。 1)您正在使用performSelector(其中確實是的操作)而不是respondsToSelector(如果允許該操作,那麼測試)。 2)appDelete有一個方法persistentContainer而不是managedObjectContext

替換

if ([delegate performSelector:@selector(managedObjectContext)]) { 
    context = [delegate managedObjectContext]; 
} 

隨着

if ([delegate respondsToSelector:@selector(persistentContainer)]) { 
    context = delegate.persistentContainer.viewContext; 
} 
相關問題