【问题标题】:Pass array to another View Controller将数组传递给另一个视图控制器
【发布时间】:2021-04-30 12:13:28
【问题描述】:

我有标签栏控制器,其中我有几个视图控制器,但我想将值数组(workoutNames)传递到我的标签栏控制器中的另一个视图。我想知道这样做的最佳选择是什么,我决定使用通过属性传递数据的方式。但是当我尝试检索数据时,我得到空数组。我也可以使用 firestore 在我的 Second View Controller 中检索数据,但它持续时间太长,所以我决定在视图之间传递数据,而不是每次都从 firestore 检索数据。

第一个视图控制器

class HomeTableViewController: UIViewController

// I need to pass this array to another view
    var workoutsName: [String] = [] 

...
      func sendDataToCalendar() {
      // IN THIS FUNCTION I RETRIEVE DATA FROM FIRESTORE AND UPDATE ARRAY WITH VALUES
// After all I print this array to check if everything is correct, and my data is here
print("\(workoutsName)")

    }

当我想使用第一个视图控制器中的数组时,这是我的第二个视图控制器

   class CalendarViewController: UIViewController {
    var arrayOfTitles = [String]()
    .
    .
    .
    func getArrayFromHome() {
    let homeVC = HomeTableViewController()
    homeVC.workoutsName = arrayOfTitles
    // NOW I PRINT TO CHECK IF DATA EXISTS
    print("\(arrayofTitles)"
    }

而且它是空的,所以数据没有通过。

也许这不是传递数据的最佳方式,但主要思想是我需要在少数视图控制器中使用这个数组。这些控制器不会通过segue连接,所以我不能使用prepareforSegue。这不是一对一的关系(将来我将在少数控制器中需要这个数组),所以我不应该使用委托。我不认为通知也可以,所以我认为通过属性传递数据是最好的选择。但也许我错了,所以请纠正我。

【问题讨论】:

    标签: ios swift xcode


    【解决方案1】:

    它不起作用的原因是你用空数据实例化了一个新的HomeTableViewController

    如果这些数据将在很多地方使用,为什么不将其保存在本地?用户默认设置似乎符合您的需求。

    func sendDataToCalendar() {
        UserDefaults.standard.set(workoutsName, forKey: "workoutsName")
    }
    

    然后你可以稍后阅读它

    func getWorkoutNameArray() {
        let workoutName = UserDefaults.standard.object(forKey: "workoutsName") as? [String]
    
    }
    

    【讨论】:

    • 感谢您的回答,但我有一个问题。这些数据将在很多地方使用,但也会经常更改。所以如果数据经常变化,用UserDefaults好不好?
    • 是的,用户默认就足够了。每次更改数据时不要忘记保存。
    • UserDefaults 是控制器之间共享数据的最差选择。
    【解决方案2】:

    在您的getArrayFromHome() 函数中,您没有访问获取数据的 HomeTableViewController 实例,而是创建了一个新实例。这就是数组为空的原因。您最终会得到 2 个 HomeTableViewController 实例,一个使用正确的数组,另一个使用空数组在函数中创建。

    如果您在引用 CalendarViewController 的同一位置传递数据会更好。

    假设您正在 HomeTableViewController 中创建和呈现 CalendarViewController,例如:

    let calendarViewController = CalendarViewController()
    calendarViewController.arrayOfTitles = workoutNames
    // Here is the presentation or push of calendarViewController
    

    阅读this SO question对你很有用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-20
      • 2012-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-13
      相关资源
      最近更新 更多