【问题标题】:Changing VC issue in Swift. How to pass data between views in tab bar controller?在 Swift 中更改 VC 问题。如何在标签栏控制器的视图之间传递数据?
【发布时间】:2014-12-23 10:44:04
【问题描述】:

我有四个 ViewController,我不使用 UITabbedbar,因为它更难定制。 我使用模态segue,但我认为内存消耗过多。 这是我的第一个和第二个 VC 的屏幕截图。 我必须使用什么来正确更改视图?


这是我使用的代码:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if (segue.identifier == "second") {
        let secondVC = segue.destinationViewController as SecondViewController;


    }
}

【问题讨论】:

  • 你想用那个代码做什么? (到目前为止,它实际上并没有做任何事情......)
  • 我称segue为“第二”
  • 您并没有在该代码中调用 segue...您只是通过将 secondVC 设置为局部常量而不对其进行任何操作来对即将发生的 segue 做出反应。如果你删除整个方法,你会看到 segue 仍在执行。

标签: ios swift uiviewcontroller uitabbarcontroller modalviewcontroller


【解决方案1】:

从您的 Storyboard 图中,很明显您已经创建了一个从“标签栏”中的每个按钮到另一个视图控制器的 segue。除了 unwind segue,segue 总是会创建一个它们正在切换到的视图控制器的新实例。因此,如果您使用您的设置从视图控制器 1 切换到视图控制器 2,然后再切换回视图控制器 1,您将不会返回到原来的视图控制器,而是创建一个全新的视图控制器 1。

这就是您的内存消耗过多的原因。您一直在创建视图控制器,直到您的应用崩溃。

我建议您重新使用标签栏控制器。它们被设计为预先分配视图控制器,然后在它们之间切换。此外,它们具有标准外观是有原因的,它可以帮助您的应用用户立即知道如何与它们进行交互。


要在选项卡之间传递数据,您不会使用转场,因为切换选项卡时不会发生转场。有很多方法可以做到这一点,但它们都归结为将模型数据存储在所有选项卡都可以访问的地方。这可以在较大的应用程序中使用 CoreData 来完成。对于一个简单的应用程序,您可以执行以下操作:

  1. 创建UITabBarController 的自定义子类。我们称之为CustomTabBarController。让该类创建并保存将由您的每个选项卡访问的模型数据。

    CustomTabBarController.swift:

    import UIKit
    
    // This class holds the data for my model.
    class ModelData {
        var name = "Fred"
        var age = 50
    }
    
    class CustomTabBarController: UITabBarController {
    
        // Instantiate the one copy of the model data that will be accessed
        // by all of the tabs.
        var model = ModelData()
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // Do any additional setup after loading the view.
        }
    }
    
  2. 在 Storyboard 的 Identity Inspector 中,将 UITabBarController 的类更改为 CustomTabBarController

  3. 在每个选项卡的viewWillAppear 中,获取对模型数据的引用,然后您就可以使用它了。

    FirstViewController.swift:

    import UIKit
    
    class FirstViewController: UIViewController {
    
        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
    
            // Get a reference to the model data from the custom tab bar controller.
            let model = (self.tabBarController as! CustomTabBarController).model
    
            // Show that we can access and update the model data from the first tab.
            // Let's just increase the age each time this tab appears and assign
            // a random name.
            model.age += 1
    
            let names = ["Larry", "Curly", "Moe"]
            model.name = names[Int(arc4random_uniform(UInt32(names.count)))]
        }
    
    }
    

    SecondViewController.swift:

    import UIKit
    
    class SecondViewController: UIViewController {
        @IBOutlet weak var nameLabel: UILabel!
        @IBOutlet weak var ageLabel: UILabel!
    
        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
    
            // Get a reference to the model data from the custom tab bar controller.
            let model = (self.tabBarController as! CustomTabBarController).model
    
            // This tab will simply access the data and display it when the view
            // appears.
            nameLabel.text = model.name
            ageLabel.text = "\(model.age)"
        }
    }
    

【讨论】:

  • 我认为您的答案基本上是正确的,但 OP 更新了她的答案以澄清她没有使用标签栏。也许您也应该编辑您的答案,以解释您的推理如何仍然适用。
  • 如何在带有标签栏的视图之间传递数据?
  • @Mala,该行只是从名称列表中选择一个随机名称并将其分配给 model.name。这只是一个演示,让示例做一些有趣的事情。
  • 我怎样才能在其他不是 viewWillAppear 的地方使用模型?我的意思是,如何使它在同一个 viewController 中可用?所以它可以用于不同的功能等等
  • viewController 中的任何方法都应该能够以与 viewWillAppear 相同的方式获取指向模型的指针。该方法很方便,因为每次选择选项卡时都会运行。
猜你喜欢
  • 2015-02-21
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-07
  • 2014-08-05
相关资源
最近更新 更多