【问题标题】:Swift: Pass value between View Controller [duplicate]Swift:在视图控制器之间传递值 [重复]
【发布时间】:2019-08-12 13:22:18
【问题描述】:

这不是重复的问题! 我搜索了许多类似的问题,但找不到像我这样将数据模型声明/调用为类的人。

我想将我的store 的信息从Table View Controller 传递给Detail View Controller。我无法声明正确类型的变量 store 以接收在我的 Detail View Controller 中传递的数据。

我的店铺模型:

class StoreModel{
    var name: String?
    var desc: String?
    var url: String?
    var rate: Double

    init(name: String?, desc: String?, url: String?, rate: Double){
        self.name = name
        self.desc = desc
        self.url = url
        self.rate = rate
    }
}

在我的 Table View Controller 中,我声明了 store 以保存来自 Firebase 的数据:

class TableViewController: UITableViewController, UISearchResultsUpdating {
    var storeList = [StoreModel]()

    override func viewDidLoad() {
        //Hide some codes that initialize Firebase connection ...
        refStores.observe(DataEventType.value, with: {(snapshot) in
            if snapshot.childrenCount > 0{
                for stores in snapshot.children.allObjects as! [DataSnapshot]{
                    let storeObject = stores.value as? [String: AnyObject]
                    let storeName = storeObject?["storeName"]
                    let storeDesc = storeObject?["storeDesc"]
                    let storeUrl = storeObject?["storeUrl"]
                    let storeRate = storeObject?["storeRate"]

                    let store = StoreModel(name: storeName as! String?,
                        desc: storeDesc as! String?,url: storeUrl as! String?, 
                        rate: storeRate as! Double)
                    self.storeList.append(store)
                }
                self.tblSearch.reloadData()
    }})}

以下是我的尝试:

在我的详细视图控制器中,我声明storeList 接收传递的数据:

var storeList = [StoreModel]()

我在我的表视图控制器和详细视图控制器之间创建了一个 segue(标识符为 showDetailView)。

override func tableView(_ tableView: UITableView, 
    didSelectRowAt indexPath: IndexPath) {
        let selectedStore = storeList[indexPath.row]
        let destinationVC = DetailViewController()
        destinationVC.storeList = selectedStore
        destinationVC.performSegue(withIdentifier: "showDetailView", sender: self)
}  }

我收到错误消息Cannot assign value of type 'StoreModel' to type '[StoreModel]',在该行 destinationVC.storeList = selectedStore,所以我想我在 Detail View Controller 中声明正确类型的变量时遇到问题。

感谢您的帮助!

【问题讨论】:

  • Detail View Controller 设置var storeList = StoreModel() 不是Array
  • @biloshkurskyi.ss 你好!这种方式显示错误:Missing argument for parameter 'name' in call.
  • 最重要的问题是let destinationVC = DetailViewController()。这不是预期的控制器实例。错误很明显:selectedStore单个 对象,storeList 需要 多个 对象。
  • 肯定是重复的。通过远端属性的期望是微不足道的,取决于你。现在在 cmets 中,您的问题已经转移到有关 Swift 语言基础的其他内容中,这些内容也很琐碎,并且已经在这里进行了很好的介绍。
  • @ayaio 你好,我在这里找不到“回答你的问题”按钮,我猜是因为我的问题被标记为重复。

标签: ios swift uitableview detailview


【解决方案1】:

您只传递了一个 Store 数据。所以你需要在 Detail View Controller 中进行更改 从此

var storeList = [StoreModel]()

var storeList:StoreModel!

这是因为这里 let selectedStore = storeList[indexPath.row] 您只选择了一个 selectedStore。

【讨论】:

  • 嗨!我试过你的方法,弹出错误Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Receiver (<nightMarket.DetailViewController: 0x7fc18651c9e0>) has no segue with identifier 'showDetailView''。但我确实将标识符 showDetailView 设置为 segue。
  • @VanessaLeung 当然它会崩溃,因为它不是故事板中的控制器。您必须覆盖prepare(for segue。研究副本。
【解决方案2】:

正如错误消息所述,无法将类型“StoreModel”的值分配给类型“[StoreModel]”。您正在尝试将模型的单个实例分配给 DetailViewController 中的数组。要么声明

var storeList = StoreModel()

在 DetailViewController 中。或将值传递为

destinationVC.storeList = [selectedStore]

也用于创建像

这样的实例
var storeList = StoreModel()

提供无参数初始化器。

class StoreModel() {
    var name: String?
    var desc: String?
    var url: String?
    var rate: Double

    init(name: String?, desc: String?, url: String?, rate: Double){
        self.name = name
        self.desc = desc
        self.url = url
        self.rate = rate
    }
    init() {
    }
}

【讨论】:

  • 嗨!你的两种方法我都试过了。两者都弹出错误:Missing argument for parameter 'name' in call
  • 请高亮弹出错误的行号
  • 这是行var storeList = StoreModel()
  • 因为你已经为类提供了一个参数化的初始化器,如果不调用提供的初始化器就无法实例化。如果你想像 var storeList = StoreModel() 一样初始化。向类添加一个无参数初始化器,如 init() {}。
  • 嗨!我不确定我是否正确理解了您的答案。但是我尝试将init(){} 添加到我的StoreModel 类中,它显示错误Return from initializer without initializing all stored properties
猜你喜欢
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-17
  • 1970-01-01
相关资源
最近更新 更多