将领域 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
成为自动调用此行代码的子控制器 类 的只读 属性 来轻松地进一步优化。祝你好运!
下面是我的项目的故事板截图:
如您所见,我有一个 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
成为自动调用此行代码的子控制器 类 的只读 属性 来轻松地进一步优化。祝你好运!