2012-04-18 32 views
9

tôi đang ở một vị trí trong ứng dụng của tôi mà về cơ bản mỗi ViewController có NSManagedObjectContext địa phương:iOS Obj-C. Đưa ra giải pháp đúng?

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext; 

và mỗi segue vượt qua managedObjectContext qua cùng setter

[segue.destinationViewController setManagedObjectContext:self.managedObjectContext]; 

Đến từ Java, nó sẽ là dễ tạo ra một lớp trừu tượng mà mỗi ViewController thực hiện. Trong mục tiêu-c nó không có vẻ như là có thể. Những gì tôi đang tìm kiếm để làm là có một lớp cơ sở thực hiện điều này đi qua, nhưng về cơ bản bất cứ điều gì mà thực hiện UIViewController sẽ có điều này (bao gồm chỉ là một UIViewController đồng bằng cũng như một UITableViewController). Nó sẽ là có thể/chính xác để có một lớp "trừu tượng" mà đặt ra như UIViewController mà hiện điều này?

Cập nhật:

UIViewController + ManagedObjectContext.h

@interface UIViewController (ManagedObjectContext) 
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext; 
@end 

UIViewController + ManagedObjectContext.m

#import "UIViewController+ManagedObjectContext.h" 
@implementation UIViewController (ManagedObjectContext){ 
    NSManagedObjectContext *context; // This is not valid, cant have local variables 
} 
@synthesize managedObjectContext; // This is not valid, must be @dynamic 
-(void)setManagedObjectContext:(NSManagedObjectContext *)context{ 
    //How do you have a local NSManagedObjectContext? 
} 
@end 
+4

Tôi nghĩ bạn có thể đang tìm kiếm một danh mục khách quan c. Chúng được sử dụng để mở rộng các lớp học. – Kyle

+2

Tạo lớp trong Objective-C 1.0 là một *** ***, vì vậy nó đã bị loại bỏ trong 2.0. Tôi không nghĩ rằng nó đã từng là một phần của lớp iOS NSObject ở tất cả. – CodaFi

+0

Trong khi tôi chưa bao giờ thấy lớp đặt ra trong iOS, tôi đã thấy một cái gì đó tương tự để thay thế UINavigationBar trong bộ điều khiển điều hướng. – Kyle

Trả lời

5

Bạn chỉ có thể làm cho lớp con của riêng bạn UIViewController, chúng ta hãy nói MOCViewController, với managedObjectContext thuộc tính. Sau đó, tất cả các bộ điều khiển chế độ xem khác của bạn là các lớp con của MOCViewController thay vì trực tiếp phân lớp UIViewController.

Nếu bạn thực sự muốn thực hiện với danh mục, danh mục của bạn có thể sử dụng objc_setAssociatedObject để đính kèm ngữ cảnh đối tượng được quản lý vào bộ điều khiển chế độ xem.

Nếu bạn chỉ thực sự có một bối cảnh đối tượng được quản lý và bạn chỉ chuyển nó đi khắp mọi nơi, hãy xem xét việc đặt ngữ cảnh trong thuộc tính của ứng dụng của bạn hoặc trong biến toàn cầu.

+0

Đây là lần đầu tiên của tôi mặc dù, nhưng sau đó bạn sẽ cần một cho mỗi loại, UIViewController, UIListViewController, vv – wuntee

+0

Tôi đã cập nhật câu trả lời của tôi. –

5

Bạn có thể lấy managedObjectContext từ một đối tượng được quản lý thay vì truyền riêng nó. Nói chung hợp lý hơn để vượt qua đối tượng được quản lý.

Ví dụ: Giả sử bạn có một đối tượng quản lý gọi điều, bạn có thể lấy managedObjectContext bằng cách gọi

NSManagedObjectContext *moc=[thing managedObjectContext]; 

Hoặc bạn có thể lấy bối cảnh đối tượng quản lý từ các đại biểu ứng dụng:

AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
NSManagedObjectContext *moc = delegate.managedObjectContext; 
+0

Đây có thể là giải pháp tốt nhất. Tôi đã chạy vào trường hợp một ViewController không có một ManagedObject, nhưng giống như 3 bước vào một Navigation. Tôi đã không nhận ra rằng bạn chỉ có thể lấy bối cảnh từ AppDelegate. Ngay cả trong trường hợp này mặc dù, nó sẽ được tốt đẹp để có phải viết rằng trong tải của mỗi lớp ... – wuntee

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