Integrating Core Data and Storyboards

Core Data很好的整合了Xcode的Strroyboards的功能,你可以用它来创建UI。这种集成允许你利用依赖注入模式(dependency injection)。依赖注入是一个控件的反转;它允许框架使用者通过引用传递到调用对象来控制流。依赖注入模式(dependency injection)是用于Cocoa开发的首选模式之一,尤其是iOS Cocoa的开发。

Integrating Core Data with a Storyboard Segue

Core Data和Storyboard一个复杂的集成点是:表格视图中显示大量的数据对象过度到介绍其中一个项目细节的子视图控制器。不使用Storyboard时,是通过重写表格视图代理(UITableViewDelegate)的tableView:didSelectRowAtIndexPath:的方法实现。然而在Storyboard里,这种方法不应该不使用,过度的处理应该在 prepareForSegue:sender:的方法里实现。

下面是演示如何将Core Data和Storyboard segue集成,组主视图控制器是一个员工的表格名单,单选中一个表格中其中一个员工时,会跳转呈现出一个员工详细的信息视图。这里假设视图控制器在segue里面有接收选择的属性。

Objective-C
@interface DetailViewController : UIViewController
 
@property (weak) AAAEmployeeMO *employee;
 
@end
Swift
class DetailViewController: UIViewController {
    
    weak var employee: EmployeeMO?
    
}

注:
在应用程序里无论那里通过NSManagedObject时,使用弱引用(weak)声明他们。当NSManagedObject被删除并且留下一个悬挂引用一个不存在的对象时,有助于保护视图控制器(view controller)。当属性(property)声明为弱引用(weak)时,并且对象被删除时,它将自动设置为nil。

下一步,在主视图控制器的prepareforsegue:方法中,通过适当的NSManagedObject实例,然后实现方法。

Objective-C
#define CellDetailIdentifier @"CellDetailIdentifier"
 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    id destination = [segue destinationViewController];
    if ([[segue identifier] isEqualToString:CellDetailIdentifier]) {
        NSIndexPath *indexPath = [[self tableView] indexPathForSelectedRow];
        id selectedObject = [[self fetchedResultsController] objectAtIndexPath:indexPath];
        [destination setEmployee:selectedObject];
        return;
    }
}
Swift
let CellDetailIdentifier = "CellDetailIdentifier"
 
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    switch segue.identifier! {
    case CellDetailIdentifier:
        let destination = segue.destinationViewController as! DetailViewController
        let indexPath = tableView.indexPathForSelectedRow!
        let selectedObject = fetchedResultsController.objectAtIndexPath(indexPath) as! EmployeeMO
        destination.employee = selectedObject
    default:
        print("Unknown segue: \(segue.identifier)")
    }
}

在segue检索过segue的标识符(需要在storyboard中的每个segue都是独特的)后,就可以安全的取得目标(destination)视图控制器(view Controller),并将选中的员工实例的引用传递给目标(destination)视图控制器(view Controller)。然后,目标(destination)视图控制器(view Controller)在其生命周期的加载部分有可用的数据引用,并显示其相关的数据。这是依赖注入(dependency injection),父视图控制器决定将哪一个员工实例交给目标(destination)视图控制器(view Controller)来控制应用程序的流程。

你可能感兴趣的:(Integrating Core Data and Storyboards)