如何在tabBarControllers之间传递数据

时间:2015-04-16 02:53:29

标签: ios arrays swift

我目前正在尝试在两个UINavigationControllers之间传递数据,并在每个UITableViewController附加UITabBarController。我通过import UIKit class placeData: Equatable { var description : String var selected : Bool init (description : String, selected : Bool) { self.description = description self.selected = selected } } class PlacesTabBarController: UITabBarController { var placeDataArray = [placeData]() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } 在这两个控制器之间导航。我一直试图在Changing VC issue in Swift. How to pass data between views in tab bar controller?上使用vacawama的解决方案。我正在使用以下代码。

UITableViewController

这是在tabBarController自定义类中。在另外两个控制器中,我声明要在视图控制器之间传递的数组,并使用链接中的方法填充var placeDataArray = [placeData]() override func viewWillAppear(animated: Bool) { placeDataArray = (self.tabBarController as PlacesTabBarController).placeDataArray }

viewWillAppear

但是,当控制器加载时,数组为空。在链接的示例中,所有其余代码都在tableView函数中,我需要将我的数组用于所有相应的 UITabBarController | | UINavigation UINavigation Controller Controller | | UITableView UITableView Controller Controller 函数。我不确定我是否只是在加载时将数组等于零。但我的想法是他们会重新填充。不知道正确的方法是什么。任何帮助都会很棒。

编辑:我目前的结构如下:

{{1}}

加载第一个标签时会填充数组。我想要做的是在第二个视图控制器中使用填充的数组,如果我在第二个视图控制器中编辑它,我希望编辑保留在第一个。所以我希望它通过引用传递。

2 个答案:

答案 0 :(得分:1)

我会将UITabBarController子类化,并使其成为两个UITableViewControllers的委托。

CustomTabBarController

protocol CustomTabBarDelegate {
    var places:Array<placeData> { get set }
}

class CustomTabBarController: UITabBarController, CustomTabBarDelegate {
    var places = Array<placeData>()

    override func viewDidLoad() {

        places = [PlaceData(),PlaceData()]

        var table1 = CustomTableViewController()
        var table2 = CustomTableViewController()

        table1.delegate = self
        table2.delegate = self

        var navController1 = UINavigationController(rootViewController: table1)
        var navController2 = UINavigationController(rootViewController: table2)

        self.viewControllers = [navController1, navController2]

    }
}

然后你的TableViewControllers只是像这样访问委托数组。

CustomTableViewController

class CustomTableViewController: UITableViewController {
    var delegate:CustomTabBarDelegate!

    override func viewDidAppear() {
        self.tableView.reloadData()
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return delegate.places.count
    }

}

.reloadData()之后,每个表格中都会显示对数组的任何更改 - 我在示例中设置CustomTableViewController以在每次显示视图时重新加载数据,因此当您更改标签时,它们应该刷新以显示最新的更改。


值得一提的是,在一个单独的类中管理数据而不是在TabBarController中保存数组可能会更清晰。

答案 1 :(得分:0)

您可以随时使用app委托.. 在那里设置一个属性,并从应用程序的任何地方调用它。

let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
var yourNeededData = appDel.yourPassingAroundDataProperty