【问题标题】:Swift getting struct to work in my first view controller?Swift 让 struct 在我的第一个视图控制器中工作?
【发布时间】:2015-12-19 07:47:49
【问题描述】:

我开始使用 struct,现在我被困在第一个 VC 上,它在另一个 VC 中按我期望的那样工作。这是我在第一个 VC 中的内容(我应该在单独的文件中包含结构吗?)

我需要使用 lVisitors = ListVisitors.sharedInstance 在我的第一个 VC 中填充表格视图(其他 VC 似乎可以工作)

    struct ListVisitors{
    static var sharedInstance = [Visitor]()

    static func register()
    {
        //NSUserDefaults.standardUserDefaults().registerDefaults( ["tasks" : [String]()])
    }

    static func load()
    {
        //Task.tasks = NSUserDefaults.standardUserDefaults().objectForKey("tasks") as! [String]
    }

    static func save()
    {
        //NSUserDefaults.standardUserDefaults().setObject(Task.tasks, forKey:"tasks")
    }

    static func append(visitor : Visitor)
    {
        //Task.tasks.append(string)
         ListVisitors.sharedInstance.append(visitor)
    }

}

class ScannerViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, AVCaptureMetadataOutputObjectsDelegate {

现在在第一个 VC 中不起作用但似乎在另一个 VC 中起作用的部分

第一个 VC 返回 Global 0

let lVisitors = ListVisitors.sharedInstance

    override func viewDidLoad() {
        super.viewDidLoad()

        // global testing
        self.testPopulateData()       
        print("Global \(lVisitors.count)")

func testPopulateData 将一些测试数据添加到 ListVisitors.sharedInstance

其他 VC 返回 test4

let lVisitors = ListVisitors.sharedInstance

    override func viewDidLoad() {
        super.viewDidLoad()        

        print(" test\(lVisitors.count)")
    }

[编辑] 在我的第一个 VC 中,在 func var ListVisitors.sharedInstance 中似乎有值,比如

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    let lVisitors = ListVisitors.sharedInstance //shouldn't have to

    print("Row Global \(lVisitors.count)")
    return scannedVisitors.count //other test way
}

[编辑 2] 我想我想出了一个可行的解决方案(tx @vadian 和 @Entalpi)

我将 testPopulateData 函数添​​加到我的自定义类中,并将其重命名为 load()(将来我喜欢用 web 服务文件替换它)。在我的第一个 VC 中声明了一个实例变量

var lVisitors = [Visitor]()

我在 viewDidLoad() 中添加了以下内容

ListVisitors.load()
  lVisitors = ListVisitors.sharedInstance

[编辑 3] 这个类似乎可以工作,但@vadian 推荐一个单例,那么我如何将这个类重写为一个单例?

class ListVisitors{
static var sharedInstance = [Visitor]()

// init(sharedInstance:Visitor){ // self.sharedInstance = sharedInstance // }

static func register()
{
    //NSUserDefaults.standardUserDefaults().registerDefaults( ["tasks" : [String]()])

}

static func load()
{
    //Task.tasks = NSUserDefaults.standardUserDefaults().objectForKey("tasks") as! [String]
    var visitor = Visitor(visitorName: "From Class Matt", visitorCompany: "Google", visitorPlace: "San Diego", visitorPhone: "94888484", visitorEmail: "matt@google.com")
    sharedInstance = [visitor]

    visitor = Visitor(visitorName: "From Class John", visitorCompany: "nike", visitorPlace: "New York", visitorPhone: "94888484", visitorEmail: "john@nike.com")
    //        ListVisitors.sharedInstance += [visitor]
    sharedInstance += [visitor]

    visitor = Visitor(visitorName: "From Class Troy", visitorCompany: "nike", visitorPlace: "New York", visitorPhone: "94888484", visitorEmail: "troy@nike.com")
    //        ListVisitors.sharedInstance += [visitor]
    sharedInstance += [visitor]
    // append
    visitor = Visitor(visitorName: "From Class Julian", visitorCompany: "leica", visitorPlace: "Tokyo", visitorPhone: "123411234", visitorEmail: "julian@shoot.co.jp")
    //        ListVisitors.append(visitor)
    sharedInstance.append(visitor)

}

static func save()
{
    //NSUserDefaults.standardUserDefaults().setObject(Task.tasks, forKey:"tasks")
}

static func append(visitor : Visitor)
{
    //Task.tasks.append(string)
    ListVisitors.sharedInstance.append(visitor)
}

static func delete(index: Int) {
    ListVisitors.sharedInstance.removeAtIndex(index)
    print("remove item")
}

}

【问题讨论】:

  • 您可以始终在函数 viewDidLoad 中检索数据 (ListVisitors.sharedInstance),而不是在任何可能太快且不可靠的函数之外。
  • @vadian 当我在 viewDidLoad 中检索数据时,我无法访问我的 tableview 函数中的数据??
  • 当然我的意思是声明一个实例变量来保存数组。
  • 所以在另一个 VC 中这样的东西应该可以工作吗? var lVisitors = [Visitor]() override func viewDidLoad() { super.viewDidLoad() lVisitors = ListVisitors.sharedInstance print(" test \(lVisitors.count)") 但它返回测试 0(应该是 3)
  • 也许viewDidLoad 还为时过早。试试viewWillAppear

标签: ios struct uiviewcontroller


【解决方案1】:

结构体的特点是它们是值类型,因此在传递它们时会被复制。

您正在一个 VC 中更改结构的一个副本,而另一个 VC 使用不同的副本,并且无法看到对第一个 VC 的结构副本所做的更改。

【讨论】:

  • hhhmm,不太明白你的意思,但是我怎样才能创建一个可以被不同的 VC 访问和更新的变量。另外我不明白为什么在函数之外定义 let lVisitors = ListVisitors.sharedInstance 在第一个 VC 中不起作用。我想我可以像“全局”一样使用结构,它可以被不同的 VC 访问。我创建了一个自定义类Visitor,结构是VisitorList,添加/删除访问者。
  • ps 我试图按照 vadian stackoverflow.com/questions/33303877/… 的这个答案建议重新阅读你的答案,我在想有没有办法我不能复制结构但使用相同的?
  • ps2:只要用类替换结构就可以解决我的问题,因为两个 VC 中的基础数据是相同的,对吧?这是价值与参考的差异?
  • 是的!就是这样,伙计! :) 问题是每个 VC 都有一个 struct 的副本。然后,当您更改一个副本时,其他副本不会更改。该课程为您提供了参考,当您通过参考进行更改时,真正的交易会发生变化,因此两个 VC 都会看到这些变化。 :)
猜你喜欢
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多