2011-11-25 43 views
9

Tôi đang gặp một số sự cố khi chuyển ngữ cảnh từ ứng dụng đại biểu sang trình điều khiển chế độ xem. Tôi đã tìm thấy nhiều hướng dẫn trên internet và tất cả đề xuất sử dụng phương pháp didFinishLaunchingWithOptions để tạo bộ điều khiển chế độ xem, đặt thuộc tính ngữ cảnh và đẩy nó. Vấn đề của tôi là tôi muốn sử dụng bảng phân cảnh và bộ điều khiển chế độ xem được tạo và được đẩy vào trong đó chứ không phải trong ủy nhiệm ứng dụng.Chuyển ngữ cảnh trong iOS để sử dụng Dữ liệu chính với Bảng phân cảnh

Tôi đã cố gắng để làm điều này trong đại biểu ứng dụng của tôi:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
//instantiate local context 
NSManagedObjectContext *context = [self managedObjectContext]; 
if (!context) 
{ 
    // Handle the error. 
    NSLog(@"Error: Context is null"); 
} 

//reference the view controller 
helloCoreDataViewController1_001 *rootViewController = [helloCoreDataViewController1_001 alloc]; 

// Pass the managed object context to the view controller 
rootViewController.managedObjectContext = context; 

return YES; 
} 

và điều này trong điều khiển điểm của tôi:

@implementation helloCoreDataViewController1_001 

@synthesize name, address, phone, status, managedObjectContext; 
//.... 

- (IBAction)saveContact 
{ 
NSLog(@"name: %@",self.name.text); 
NSLog(@"address: %@",self.address.text); 
NSLog(@"phone: %@",self.phone.text); 

//Save the new instance of the contact entity 
Contact *contact = (Contact *)[NSEntityDescription insertNewObjectForEntityForName:@"Contacts" inManagedObjectContext:managedObjectContext]; 

[contact setContactName:[NSString stringWithFormat:@"%@",self.name.text]]; 
[contact setValue:self.address.text forKey:@"address"]; 
[contact setContactPhone:[NSString stringWithFormat:@"%@",self.phone.text]]; 

NSError *error = nil; 

if (![managedObjectContext save:&error]) 
{ 
    // Handle the error. 
    NSLog(@"error: %@", error.description); 
    self.status.text = @"Error: contact NOT saved"; 
} 
else 
    self.status.text = @"Contact saved"; 
} 

Khi tôi gỡ lỗi, tôi có thể thấy rằng trong các đại biểu ứng dụng, ngữ cảnh được điền chính xác và cả thuộc tính trong trình điều khiển chế độ xem đều ok. Nhưng khi phương thức saveContact của tôi được gọi, ngữ cảnh trống.

Bạn có bất kỳ đề xuất nào về điều này không? Làm thế nào tôi có thể vượt qua bối cảnh để bộ điều khiển xem với bảng phân cảnh?

Trả lời

9

Bạn có thể nhận rootviewcontroller của Storyboard trong didFinishLaunchingWithOptions bằng cách truy cập

self.window.rootViewController 

thay vì cấp phát mới.

Vì vậy, hai dòng trong didFinishLaunchingWithOptions của bạn sẽ giống như thế này:

helloCoreDataViewController1_001 *rootViewController = (helloCoreDataViewController1_001 *)self.window.rootViewController; 
rootViewController.managedObjectContext = context; 
-1

Thay vì đi qua bối cảnh obeject quản lý của bạn với bộ điều khiển xem thử để có được nó trên bộ điều khiển nhìn từ appdelegate:

- (NSFetchedResultsController *)fetchedResultsController 
{ 
    if (fetchedResultsController != nil) { 
     return fetchedResultsController; 
    } 
if (managedObjectContext == nil) { 
    id appDelegate = (id)[[UIApplication sharedApplication] delegate]; 
    self.managedObjectContext = [appDelegate managedObjectContext]; 
    }... //finish your fetch request of course... 
} 

Với tôi nó làm việc thật đẹp

+0

Điều này làm cho hệ thống cấp bậc lớp học của bạn rất cứng nhắc, điều khiển xem của bạn bây giờ phải biết về các đại biểu ứng dụng và phụ thuộc vào nó. Cá nhân tôi thích có thuộc tính trên bộ điều khiển chế độ xem mà tôi chỉ định khi tạo chế độ xem. –

+0

@Chris bạn nói đúng. Đây chỉ là một phương pháp khác. Tôi đã sử dụng điều này trong một trong các ứng dụng của mình có ngữ cảnh khác. Đây chỉ là một lựa chọn khác sau đó ... – Farini

Các vấn đề liên quan