如何在表格上创建两个不同的部分?

时间:2019-04-23 11:38:35

标签: swift

我正在尝试将这些数据分为两个不同的部分:  –一个部分的电影运行时间超过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 个答案:

答案 0 :(得分:1)

假设120将是section = 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]
}

答案 1 :(得分:0)

最好有2个数组-一个数组包含短于120分钟的电影,另一个数组包含长于120分钟的电影。您应该从int数组创建这两个数组:

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...])
}

答案 2 :(得分:0)

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
}

答案 3 :(得分:0)

“ movieList”数组可以根据运行时值过滤掉。

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