将领域 Object 与 iOS 9 中的 UITabBarController 与 RealmSwift 相关联

Associating a Realm Object with a UITabBarController in iOS 9 with RealmSwift

下面是我的项目的故事板截图:

如您所见,我有一个 UIViewController,其中 UITableView 嵌入 UINavigationController。当用户向 UITableView 添加一个项目时,将创建一个新的领域 Object 模型,我将其命名为 Project (我使用的是 RealmSwift),它们将被带到UITabBarController。我想知道是否可以将 UITabBarController 及其所有 child 视图控制器与创建的 Project 相关联。

这是创建 Object 的代码(工作正常):

    func add(withName projectName: String) {
        let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
        dispatch_async(queue) {
            autoreleasepool {
                let realm = try! Realm()
                let newProject = Project(value: ["name": projectName, "date": NSDate()])
                realm.write({ () -> Void in
                    realm.add(newProject)
                })
            }
        }
    }

   override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        tableView.deselectRowAtIndexPath(indexPath, animated: true)

        selectedProject = array[indexPath.row]
        print(selectedProject)
        self.performSegueWithIdentifier("showTab", sender: self)
    }

   override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "showTab" {
            let dvc = segue.destinationViewController as! TabBarViewController
                dvc.project = selectedProject

        }
    }

如您所见,我正在将新 Project 传递给 UITabBarController

这是我在 UITabBarController:

中的代码
import UIKit
import RealmSwift

class MasterTabViewController: UITabBarController {

    var project: Project?

    override func viewDidLoad() {
        super.viewDidLoad()
        configureNavigationBar()
        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    }

    // MARK: - UI Styling
    private extension MasterTabViewController {
        func configureNavigationBar() {
            navigationItem.title = project?.name
        }

    }   

这设置了 UITabBarController.

所有 UIViewController 的标题

有没有办法让 Project object 可用于从 UITabBarController 派生的所有视图控制器?我一直无法找到太多关于此的信息。我发现的一个建议是将 Object 存储在 NSUserDefaults 中,但在我看来必须有更好的方法。

编辑:我忘了补充一点,我可以想出一种使用 NSManagedObjectContext 对核心数据执行此操作的方法,但我在 Realm 中看到等效项时遇到了一些麻烦。

你走对了!当视图控制器是 UITabBarController 的子视图控制器时,您可以使用 self.tabBarController 属性.

从子视图控制器内部访问选项卡栏控制器

因为您知道这些视图控制器是 UITabBarController 的子类的子类,该子类还提供 Project 作为 属性,所以只需调用该选项卡栏控制器即可属性,将生成的视图控制器类型转换为您的选项卡栏控制器子类,然后在其上调用 project 属性。

因此,在您的任何子控制器中:

let project = (self.tabBarController as MasterTabViewController).project?

您可以通过使 project 成为自动调用此行代码的子控制器 类 的只读 属性 来轻松地进一步优化。祝你好运!