Вывод элемента из двумерного массива из отдельного класса - PullRequest
0 голосов
/ 07 декабря 2018

Мне нужно вывести второй элемент из двумерного массива из одного класса в TableViewController.Я попытался пару вещей, таких как data.reduce into:, но не повезло.Предполагается, что FirstViewController будет заполнен тремя жанрами «Action, Suspense and Romance», по которым можно щелкнуть, чтобы показать все фильмы этого жанра.

Первый класс:

     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{
      }
  }

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Вам необходимо преобразовать данные в форму, которую затем можно проиндексировать с помощью табличного представления.Я бы изменил его в словарь, используя следующий код.

let genreDictionary = data.reduce(into: [:]) { d, element in
    d[element[1], default: []].append(element[0])
}

Это создаст следующий словарь

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

Затем в функциях табличного представления вы используете словарь следующим образом

   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
   }

Когда вам нужен массив фильмов для определенной строки табличного представления, вы можете использовать следующее

let d = model.genreDictionary
let arrayOfFilms = d[d.keys.index(d.startIndex, offsetBy: indexPath.row)].value
0 голосов
/ 07 декабря 2018

Вы можете использовать Set, чтобы получить все жанры без дубликатов.

  1. Я узнал, что вы хотите отобразить жанры в вашем TableView с помощью model.genreArray, но ваш genreArray всегда пуст, потому что вы никогда не добавляете к нему данные.
  2. Второйвещь, которую я распознал: в вашем TableViewController вы реализовали функцию didReciveDataUpdate, но вы ничего с ней не сделали.

Первый класс:

 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 )

 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{
  }

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...