首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从独立类的二维数组中输出元素

从独立类的二维数组中输出元素
EN

Stack Overflow用户
提问于 2018-12-07 05:04:50
回答 2查看 69关注 0票数 0

我需要将第二个元素从一个类的二维数组输出到一个TableViewController。我尝试过几种方法,比如data.reduce into:,没有运气。FirstViewController应该有三种类型的“动作,悬念和浪漫”,然后可以点击显示属于该类型的所有电影。

一级:

代码语言:javascript
复制
     import Foundation

        protocol MovieModelDelegate: class {
           func didRecieveDataUpdate(data: [[String]])
        }

        class MovieModel {

           weak var delegate: MovieModelDelegate?

           var genreArray: [String] = []
           let data: [[String]] = [
              ["Avatar", "Action"],
              ["Limitless", "Suspense"],
              ["Die Hard", "Action"],
              ["The Avengers", "Action"],
              ["The Notebook", "Romance"],
              ["Lakehouse", "Romance"],
              ["Gone Girl", "Suspense"],
              ["Deadpool", "Action"],
              ["Passengers", "Suspense"],
              ["Inception", "Suspense"],
              ["Mission Impossible", "Action"]
         ]

          func requestData() {
             let movie: [[String]] = data
             delegate?.didRecieveDataUpdate(data: movie)
          }
       }


**TableView Class:**


    class FirstTableView: UITableViewController, MovieModelDelegate {

       var model = MovieModel()
       var selectedGenre: String = ""

       override func viewDidLoad() {
          super.viewDidLoad()
          model.delegate = self
          model.requestData()
       }

       override func numberOfSections(in tableView: UITableView) -> Int {
          return 1
       }

       override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
          return model.genreArray.count
       }

       override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
          let cell = tableView.dequeueReusableCell(withIdentifier: "GenreCells", for: indexPath) as! TableViewCell
          cell.genreLabel?.text = model.genreArray[indexPath.item]
          return cell
       }

       override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
          selectedGenre = model.data[indexPath.row]
          selectedGenre = ""
          for indexPath in model.data{
              if indexPath[1] == selectedGenre{
                  selectedGenre.append(indexPath[0])
              }
          }
      }

      override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
          if (segue.identifier == "pushToMovies") {
              if let VC = segue.destination as? FilteredSelection {
                  VC.selectedMovies = [selectedGenre]
              }
          }
      }

      func didRecieveDataUpdate(data: [[String]]) {
      }

      deinit{
      }
  }
EN

回答 2

Stack Overflow用户

发布于 2018-12-07 07:16:57

您可以使用Set获取所有类型,而不需要重复。

  1. 我认识到您希望用TableView显示model.genreArray中的类型,但是您的genreArray始终是空的,因为您从未将数据附加到其中。
  2. 我提到的第二件事是:在您的TableViewController中,您实现了didReciveDataUpdate函数,但是您没有对它做任何事情。

头等舱:

代码语言:javascript
复制
 import Foundation
    protocol MovieModelDelegate: class {
       func didRecieveDataUpdate(data: [[String]])
    }

    class MovieModel {

       weak var delegate: MovieModelDelegate?


       let data: [[String]] = [
          ["Avatar", "Action"],
          ["Limitless", "Suspense"],
          ["Die Hard", "Action"],
          ["The Avengers", "Action"],
          ["The Notebook", "Romance"],
          ["Lakehouse", "Romance"],
          ["Gone Girl", "Suspense"],
          ["Deadpool", "Action"],
          ["Passengers", "Suspense"],
          ["Inception", "Suspense"],
          ["Mission Impossible", "Action"]
     ]

     private var genres = [String]()

     public init() {
     for dataSet in data {
        self.genres.append(dataSet[1])
     }

     //this will generate a array with only uniqe genres
     var genreArray = Array(Set(self.genres))

     }

      func requestData() {
         let movie: [[String]] = data
         delegate?.didRecieveDataUpdate(data: movie)
      }
   }

FirstTableView类:

(查看didReciveDataUpdate函数)

代码语言:javascript
复制
 class FirstTableView: UITableViewController, MovieModelDelegate {

   var model = MovieModel()
   var selectedGenre: String = ""

   override func viewDidLoad() {
      super.viewDidLoad()
      model.delegate = self
      model.requestData()
   }

   override func numberOfSections(in tableView: UITableView) -> Int {
      return 1
   }

   override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
      return model.genreArray.count
   }

   override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
      let cell = tableView.dequeueReusableCell(withIdentifier: "GenreCells", for: indexPath) as! TableViewCell
      cell.genreLabel?.text = model.genreArray[indexPath.row]
      return cell
   }

   override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
     //To get the Genre
      selectedGenre = model.data[indexPath.row][1]

      for indexPath in model.data{
          if indexPath[1] == selectedGenre{
              selectedGenre.append(indexPath[0])
          }
      }
  }

  override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
      if (segue.identifier == "pushToMovies") {
          if let VC = segue.destination as? FilteredSelection {
              VC.selectedMovies = [selectedGenre]
          }
      }
  }

  func didRecieveDataUpdate(data: [[String]]) {
     //=================here you need to update your tableView===================
  }

  deinit{
  }

}

票数 0
EN

Stack Overflow用户

发布于 2018-12-07 10:03:22

您需要将数据更改为表单,然后由表视图对其进行索引。我将使用以下代码将其转换为字典。

代码语言:javascript
复制
let genreDictionary = data.reduce(into: [:]) { d, element in
    d[element[1], default: []].append(element[0])
}

这将创建以下字典

代码语言:javascript
复制
["Suspense": ["Limitless", "Gone Girl", "Passengers", "Inception"], 
 "Romance": ["The Notebook", "Lakehouse"], 
 "Action": ["Avatar", "Die Hard", "The Avengers", "Deadpool", "Mission Impossible"]]

然后,在表视图函数中使用字典,如下所示

代码语言:javascript
复制
   override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
      return model.genreDictionary.count
   }

   override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
      let cell = tableView.dequeueReusableCell(withIdentifier: "GenreCells", for: indexPath) as! TableViewCell
      let d = model.genreDictionary
      cell.genreLabel?.text = d[d.keys.index(d.startIndex, offsetBy: indexPath.row)].key
      return cell
   }

当您需要某个表视图行的电影数组时,可以使用以下方法

代码语言:javascript
复制
let d = model.genreDictionary
let arrayOfFilms = d[d.keys.index(d.startIndex, offsetBy: indexPath.row)].value
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53663563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档