ios - 尝试将数据存储在类中,更改 View Controller 时返回 nil

标签 ios swift class

我正在制作一个应用程序,用户可以从 3 个不同的数组中进行选择,这些数组会更改下一页上一些 UI 按钮内的文本。我构建了一个应用程序的粗略演示,将数组硬编码到 View Controller ,而根本没有真正使用模型。现在,我已经从 View Controller 中取出了所有功能,并将其放入一个单独的类 cardDatabase 中。

下面是 cardDatabase 类。

class cardDatabase {

public func updateCardSelection(cardSet: Int){
    print("updateCardSelection called")
    switch cardSet {
    case 0:
        selectedCardArray = cardSetOne
        selectedCardNum = 0
    case 1:
        selectedCardArray = cardSetTwo
        selectedCardNum = 1
    case 2:
        selectedCardArray = cardSetThree
        selectedCardNum = 2
    default:
        print("Debug Error - Card set not recognised")
    }
    print(selectedCardNum)
}


public var selectedCardNum: Int!
public var selectedCardArray: Array<String>!

//Create arrays for each card dataset
public let cardSetOne = [
    "Word 1",
    "Word 2",
    "Word 3",
    "Word 4",
    "Word 5",
    "Word 6",
    "Word 7",
    "Word 8",
    "Word 9"
]

public let cardSetTwo = [
    "1",
    "2",
    "3",
    "4",
    "5",
    "6",
    "7",
    "8",
    "9"
]

public let cardSetThree = [
    "a",
    "b",
    "c",
    "d",
    "e",
    "f",
    "g",
    "h",
    "i"
]

}

正如您所看到的,有 3 个数组填充了不同的单词,这些数组将显示在另一个屏幕上。我正在努力解决的是让我的数据库实际存储任何数据。当我移动到显示数组的屏幕时,我不是直接从数据库中提取数据,而是通过 segue 发送信息。

我设想数据库充当应用程序的模型, Controller 可以从模型中提取信息并将其显示在 View 中。相反,每次我推送一个新 View 时,数据库中的值都会设置为 nil,从而使数据库实际上毫无用处!

下面我包含了初始 View 的代码。这真的很困扰我,因为我发誓我在以前的应用程序中使用了独立的类来存储变量,但我从未遇到过这个问题!

import Foundation
import UIKit

var firstLoad = true

class MainMenuVC: UIViewController {

var cardEngine: cardDatabase!

override func viewDidLoad() {
    super.viewDidLoad()

    cardEngine = cardDatabase()

    if firstLoad == true {
        cardEngine.selectedCardArray = cardEngine.cardSetOne
        cardEngine.selectedCardNum = 0
        firstLoad = false
    }

    print("selected cardNum = \(cardEngine.selectedCardNum), sender MainMenuVC")
    cardSelector.selectedSegmentIndex = cardEngine.selectedCardNum

}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "Present Card Selection" {
        let destinationVC = (segue.destination as! CardSelectionVC)
        destinationVC.cardList = cardEngine.selectedCardArray
    }
}



@IBOutlet weak var cardSelector: UISegmentedControl!
@IBAction func cardSetSelected(_ sender: UISegmentedControl) {
    cardEngine.updateCardSelection(cardSet: sender.selectedSegmentIndex)
}

}

最佳答案

如果每次加载新 View 时都创建一个新的cardDatabase实例,它当然会将该cardDatabase实例的未初始化变量(selectedCardNum和selectedCardArray)设置为nil。相反,你可以—— 要么将您的cardDatabase转换为Singleton类,这样只有一次实例被生成并通过调用cardDatabase.shared传递,这将保持值可用(因为该实例被保留),如下所示:

class cardDatabase {
     private static var instance : cardDatabase? = nil
     private static var __once: () = {
       instance = cardDatabase()
     }
     class var shared:cardDatabase{
        get{
            _ = cardDatabase.__once
            return instance!
        }
     }
     //Add your vars and functions below
}

-- 或者,如果您不关心继承,请将所有内容设为静态,这样您就不需要创建 cardDatabase 的任何实例,并且它们的值将保留在类级别(cardDatabase.selectedCardArray、cardDatabase.selectedCardNum),例如这个:

class cardDatabase {

  public static func updateCardSelection(cardSet: Int){
      print("updateCardSelection called")
      switch cardSet {
      case 0:
        selectedCardArray = cardSetOne
        selectedCardNum = 0
      case 1:
        selectedCardArray = cardSetTwo
        selectedCardNum = 1
     case 2:
        selectedCardArray = cardSetThree
        selectedCardNum = 2
    default:
     print("Debug Error - Card set not recognised")
   }
   print(selectedCardNum)
 }


 public static var selectedCardNum: Int!
 public static var selectedCardArray: Array<String>!

//Create arrays for each card dataset
 public static let cardSetOne = [
    "Word 1",
    "Word 2",
    "Word 3",
    "Word 4",
    "Word 5",
    "Word 6",
    "Word 7",
    "Word 8",
    "Word 9"
  ]

 public static let cardSetTwo = [
    "1",
    "2",
    "3",
    "4",
    "5",
    "6",
    "7",
    "8",
    "9"
  ]

 public static let cardSetThree = [
    "a",
    "b",
    "c",
    "d",
    "e",
    "f",
    "g",
    "h",
    "i"
  ]
}

关于ios - 尝试将数据存储在类中,更改 View Controller 时返回 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46984897/

相关文章:

ios - UITableview:无法从其数据源获取单元格

ios - 通过命令行导出仪器跟踪数据以防泄漏

swift - 如何调试信号 SIGABRT

ios - AVAudioSession:在应用程序中录制音频,同时允许“音乐”应用程序通过蓝牙播放

iphone - 最后一个 imageView 点击了 UIScrollView

ios - 如果在可选类型中缺少值时让条件为 true,则 swift

ios - 如何加入多个 observeSingleEvent() 调用结果并在所有调用完成后执行操作?

php - 在 PHP 中创建多级类

c++在该类中声明该类的变量

javascript - JavaScript 中类的嵌套和 this 值