Как мне создать два разных раздела на столе? - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь разделить эти данные на два разных раздела: - один раздел с фильмами времени выполнения более 120 минут, другой для отдыха.

Проблема в том, что я извлекаю данные из того же массива. Как я могу применить условный оператор / логику и вставить в каждый раздел в зависимости от значения? Однако я могу извлечь данные из разных массивов и вставить их в разные разделы. Пожалуйста, ведите меня. Спасибо

import UIKit

class ViewController: UIViewController,
UITableViewDelegate, UITableViewDataSource{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: 
 Int) -> Int {
    return movieList.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


    let cell : MovieCell =  tableView.dequeueReusableCell(withIdentifier: "MovieCell", for: indexPath) as! MovieCell


    let p = movieList[indexPath.row]
    cell.nameLabel.text = p.movieName
    cell.runTimeLabel.text = "\(p.runtime) mins"
    cell.movieImageView.image = UIImage(named: p.imageName)
    return cell
}


var movieList : [Movie] = []



@IBOutlet weak var tableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()


    movieList.append(Movie(movieName:"Oklahoma Crude",
                           movieDesc:"",
                           runtime:115,
                           imageName:"movie_oklahoma"))
    movieList.append(Movie(movieName:"Bootleggers",
                           movieDesc:"",
                           runtime:140,
                           imageName:"movie_bootleggers"))
    movieList.append(Movie(movieName:"Superdad",
                           movieDesc:"",
                           runtime:112,
                           imageName:"movie_superdad"))

 // Do any additional setup after loading the view, typically from a nib.
}

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete{
        movieList.remove(at: indexPath.row)
        tableView.deleteRows(at: [indexPath], with: .automatic)
    }
}





@IBAction func editButton(_ sender: Any) {

    if !self.tableView.isEditing
    {
        (sender as AnyObject).setTitle("Done", for: .normal)
        tableView.setEditing(true, animated: true)
    }
    else
    {
        (sender as AnyObject).setTitle("Edit", for: .normal)
        tableView.setEditing(false, animated: true)
    }    }



func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
    let m  = movieList[sourceIndexPath.row]
    movieList.remove(at:sourceIndexPath.row)
    movieList.insert(m, at:destinationIndexPath.row)
}





func numberOfSections(in tableView: UITableView) -> Int {
    return 2
}
let headerTitles = ["More than 120 minutes", "Others"]


func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    if section < headerTitles.count {
        return headerTitles[section]
    }

    return nil
}

}

Ответы [ 4 ]

1 голос
/ 23 апреля 2019

Предположим, что со значением 120 будет сечение = 0

func tableView(_ tableView: UITableView, numberOfRowsInSection section: 
 Int) -> Int {
     let arr120 = movieList.filter { $0.runtime >= 120 }
     let arrLess120 = movieList.filter { $0.runtime < 120 }
     return section == 0 ? arr120.count : arrLess120.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

  if indexPath.section == 0 {
       let arr120 = movieList.filter { $0.runtime >= 120 }
        ///..
  }
  else {
       let arrLess120 = movieList.filter { $0.runtime < 120 }
       ////....
  }

Как бы это не было идеальное решение, вы можете организовать свой источник данных в

struct AllMovies {
      let title:String // ex. above 120
      let arr:[Movie]
}
0 голосов
/ 23 апреля 2019

Массив movieList может быть отфильтрован в зависимости от значения времени выполнения.

if indexPath.section == 0 {
    movieList.filter { $0.runtime >= 120 }
  }
else {
    movieList.filter { $0.runtime < 120 }
}
0 голосов
/ 23 апреля 2019
var movieList = [String]()
var movieListGreaterThen120  = [String]()
var movieListSmallerThen120  = [String]()

for item in movieList {
    if item.runtime > 120 {
        movieListGreaterThen120.append(item)
    }else {
        movieListSmallerThen120.append(item)
    }
}

//MARK: - tableView DataSource
func tableView(_ tableView: UITableView, numberOfRowsInSection section:
    Int) -> Int {
    if section == 0 {
        return movieListGreaterThen120.count
    }else {
        return movieListSmallerThen120.count
    }
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


    let cell : MovieCell =  tableView.dequeueReusableCell(withIdentifier: "MovieCell", for: indexPath) as! MovieCell
    if indexPath.section == 0 {
        //Load your movieListGreaterThen120 Data
    }else {
        //Load your movieListSmallerThen120 Data
    }

    return cell
}
func numberOfSections(in tableView: UITableView) -> Int {
    return 2
}
0 голосов
/ 23 апреля 2019

Лучше иметь 2 массива - один, содержащий фильмы продолжительностью менее 120 минут, и другой, содержащий фильмы продолжительностью более 120 минут. Вы должны создать эти два массива из массива movieList:

var lessThan120: [Movie]!
var moreThan120: [Movie]!

override func viewDidLoad() {
    super.viewDidLoad()


    movieList.append(Movie(movieName:"Oklahoma Crude",
                           movieDesc:"",
                           runtime:115,
                           imageName:"movie_oklahoma"))
    movieList.append(Movie(movieName:"Bootleggers",
                           movieDesc:"",
                           runtime:140,
                           imageName:"movie_bootleggers"))
    movieList.append(Movie(movieName:"Superdad",
                           movieDesc:"",
                           runtime:112,
                           imageName:"movie_superdad"))
    let count = movieList.partition(by: {$0.runtime > 120})
    lessThan120 = Array(movieList[0..<count])
    moreThan120 = Array(movieList[count...])
}

Тогда реализация методов источника данных будет очень простой:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: 
 Int) -> Int {
    if section == 0 {
        return moreThan120.count
    } else if section == 1 {
        return lessThan120.count
    } 
    return 0
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


    let cell : MovieCell =  tableView.dequeueReusableCell(withIdentifier: "MovieCell", for: indexPath) as! MovieCell


    let p = indexPath.section == 0 ? moreThan120[indexPath.row] : lessThan120[indexPath.row]
    cell.nameLabel.text = p.movieName
    cell.runTimeLabel.text = "\(p.runtime) mins"
    cell.movieImageView.image = UIImage(named: p.imageName)
    return cell
}

func numberOfSections(in tableView: UITableView) -> Int {
    return 2
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...