5

My RootViewController chứa chế độ xem bảng đơn giản. Khi chọn một trong các mục trong bảng, một DetailViewController được hiển thị với nhiều chi tiết hơn về mục được chọn. Dữ liệu của đối tượng dữ liệu có liên quan được tải và duy trì thông qua CoreData. Làm thế nào để vượt qua trên FetchedResultsController và ManagedObjectContext đến DetailViewController trong phương thức didSelectRowAtIndexPath:? Tôi có cần định nghĩa các thuộc tính cho cả hai trong DetailViewController.h không? Bạn có thể cung cấp cho tôi một mẫu mã không?Sử dụng FetchedResultsController và ManagedObjectContext trong nhiều bộ điều khiển chế độ xem

Trả lời

19

Thứ nhất, mỗi trường hợp bộ điều khiển kết quả được tìm nạp (FRC) được cấu hình cụ thể cho mỗi tableview để bạn không chuyển FRC từ bộ điều khiển tableview sang bộ điều khiển tableview. Thay vào đó, mỗi bộ điều khiển tableview instantiates và cấu hình một FRC mới đặc biệt cho tableview của nó.

Trong thiết kế chính-chi tiết trong đó chế độ xem bảng là chế độ xem chính, bạn không chuyển FRC sang chế độ xem chi tiết mà thay vào đó chỉ là đối tượng được quản lý duy nhất được biểu thị bằng hàng xem bảng đã chọn.

Apple khuyến cáo rằng ngữ cảnh đối tượng được quản lý (MOC) được chuyển bởi "tiêm phụ thuộc". Điều này rất đơn giản. Trong thiết kế phổ biến nhất, bạn khởi tạo MOC trong ủy nhiệm ứng dụng, sau đó cung cấp cho mỗi bộ điều khiển xem của bạn với thuộc tính managedObjectContext. Sau đó, khi bạn tải/đẩy một bộ điều khiển xem, bạn chỉ cần đặt thuộc tính managedObjectContext cho MOC.

Ví dụ, trong thiết kế Master-Detail, bạn thường có bộ điều khiển điều hướng (NAV). Để xem cách hoạt động của tính năng này, hãy tạo ứng dụng thử nghiệm bằng mẫu ứng dụng dựa trên điều hướng trong Xcode. Đánh dấu để sử dụng Dữ liệu cốt lõi. Bạn sẽ có cả đại biểu ứng dụng và số RootViewController có thuộc tính managedObjectContext.

Bây giờ trong phương pháp ứng dụng đại biểu của applicationDidFinishLaunching:... thêm mã để làm cho nó trông giống như:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Override point for customization after application launch. 
    // Add the navigation controller's view to the window and display. 
    RootViewController *topVC=(RootViewController *) self.navigationController.topViewController; 
    topVC.managedObjectContext=self.managedObjectContext; 
    self.window.rootViewController = self.navigationController; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

... sau đó trong RootViewController.m add:

- (void)viewDidAppear:(BOOL)animated 
{ 
    NSLog(@"self.managedObjectContext = %@",self.managedObjectContext); 
    [super viewDidAppear:animated]; 
} 

Khi bạn chạy các ứng dụng thử nghiệm các RootViewController đối tượng sẽ ghi nhật ký là managedObjectContext thuộc tính nào đó như:

2011-07-19 09:24:05.193 CDNavTemplate[3203:207] self.managedObjectContext = <NSManagedObjectContext: 0x4d318a0> 

... chứng minh rằng đối tượng RootViewController có ngữ cảnh đối tượng được quản lý từ đại biểu ứng dụng.

Bây giờ, bạn chỉ cần lặp lại quy trình cho mỗi bộ điều khiển chế độ xem mà bạn đẩy lên ngăn điều khiển điều hướng dần xử lý đối tượng bối cảnh đối tượng được quản lý giống nhau xuống phân cấp chế độ xem. Bạn có thể truyền bất kỳ loại đối tượng nào khác theo cùng một cách chính xác.

Apple khuyến cáo tiêm phụ thuộc vì nó làm cho mã thêm mô đun và giúp dễ sử dụng nhiều bối cảnh đối tượng được quản lý trong một ứng dụng duy nhất. Bạn chỉ cần vượt qua từng bộ điều khiển xem cụ thể mà bối cảnh cụ thể mà nó cần tại bất kỳ thời điểm cụ thể nào.

+0

Đây là thông tin rất có giá trị đối với tôi, tôi đang tìm kiếm một lời giải thích như vậy trong tất cả các cuốn sách và trong tài liệu, nhưng không thể tìm thấy nó. Cảm ơn một bó - bạn đã làm cho ngày của tôi! – Otto64

+0

Những người viết tài liệu và sách đều hiểu rõ về API nên thật khó để họ hiểu được điều gì làm người dùng bối rối. Đó là vấn đề lớn trong lĩnh vực đào tạo. Tôi phải đối phó với nó mọi lúc. – TechZen

+0

Ngọt ngào, giải thích tuyệt vời Sir. – nmdias

1

Nói tóm lại, có hai tùy chọn:

  1. Cả hai (FetchedResultsController và ManagedObjectContext) cần phải được ở một vị trí nơi mà tất cả các bộ điều khiển xem có thể truy cập chúng. Ví dụ, nếu chúng nằm trong App Delegate (nơi Xcode đặt ManagedObjectContext theo mặc định), bạn có thể truy cập nó theo cách này (điều này sẽ hiển thị một cảnh báo - vì vậy bạn sẽ cần phải nhập delegate vào lớp ứng dụng của ứng dụng) :
NSManagedObjectContext *context = [[[UIApplication sharedApplication] delegate] managedObjectContext];
  1. bạn thực sự có thể vượt qua những giá trị vào bộ điều khiển tầm nhìn của bạn khi bạn tạo chúng. Ví dụ, bạn có thể tạo một lớp con (chẳng hạn như DataViewController hoặc một cái gì đó) và có hai thuộc tính trên lớp con này (cho ManagedObjectContext và FetchedResultsController) sẽ được thiết lập khi bạn tạo chúng.
+0

Bạn không nên chuyển bộ điều khiển kết quả đã tìm nạp từ bộ điều khiển xem để xem bộ điều khiển vì FRC dành riêng cho mỗi lần xem bảng. Mỗi tableview nên có FRC riêng của nó. – TechZen

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