【问题标题】:Associating a Realm Object with a UITabBarController in iOS 9 with RealmSwift在 iOS 9 中使用 RealmSwift 将 Realm 对象与 UITabBarController 相关联
【发布时间】:2015-09-01 22:53:25
【问题描述】:

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

如您所见,我有一个 UIViewController 和一个 UITableView 嵌入在 UINavigationController 中。当用户将一个项目添加到UITableView 时,会创建一个我命名为Project 的新领域Object 模型(我正在使用RealmSwift),它们会被带到UITabBarController 中的第一个项目。我想知道是否可以将UITabBarController 及其所有子视图控制器与创建的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 继承的所有UIViewControllers 的标题。

我有没有办法让 Project 对象可用于从 UITabBarController 继承的所有视图控制器?我还没有找到太多这方面的信息。我发现的一个建议是将Object 存储在NSUserDefaults 中,但在我看来必须有更好的方法。

编辑:我忘了补充一点,我可以想办法使用 NSManagedObjectContext 对 Core Data 执行此操作,但我在 Realm 中看到等效项时遇到了一些麻烦。

【问题讨论】:

    标签: ios swift swift2 realm ios9


    【解决方案1】:

    你在正确的轨道上!当视图控制器是 UITabBarController 的子视图时,您可以使用 self.tabBarController 属性从子视图控制器内部访问标签栏控制器。

    既然您知道这些视图控制器是 UITabBarController 的子类的子类,该子类还提供 Project 作为属性,那么只需调用该选项卡栏控制器属性,将生成的视图控制器类型转换到您的选项卡即可bar控制器子类,然后调用project属性就可以了。

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

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

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

    【讨论】:

    • 这就是我今天早上开始采用的方法,我几乎让它按我想要的方式工作。你的解释有助于澄清事情。谢谢!
    • 太棒了!我很高兴听到这个消息!如果需要更多问题,你知道在哪里可以找到我!祝你好运! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 2021-08-01
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多