TableView与Segues到多个视图

时间:2018-10-10 06:57:10

标签: ios swift uitableview segue

我是iOS开发的新手。我希望得到帮助,如果我的问题过于基本,也表示歉意。 我刚刚习惯UITableViewController和委托数据源。

我有FirstViewController像照片enter image description here

当用户触摸segmentedController内部时,TableViewCell将重新加载数据以显示正在播放的电影和即将上映的电影(仅为我的学习目的而设计的一个简单的电影预订应用程序)。

enter image description here

我发现对多个视图的排序存在问题。
当用户选择单元格时。
如何为每个重载数据分配标识符,以便在单击单元格时将数据传递到另一个ViewController(例如:DetailViewUpcomingDetailViewShowing)。在这里,我还有另外两个ViewController来记录有关即将上映的电影和显示电影的详细信息(图像,名称,日期和反向按钮.... etc)

enter image description here

如果可能,我只需要想法方面的帮助。或代码说明非常好。尽管我尝试在功能中实现segue:tableview(_tableView:UITableView,didSelectRowAt indexPath:IndexPath),但我的程序未按预期执行。因为我在segmentedControll上遇到麻烦(我想这是问题所在)

我之前已经阅读过此post

谢谢大家

3 个答案:

答案 0 :(得分:1)

您需要实现的逻辑是:

  1. 检查segmentedIndex以了解用户是要查看“即将显示”还是“正在显示”。
  2. 按照第1步的方式向tableView加载电影。
  3. 当用户点击单元格时,使用segmentedIndex标识是否应从“即将来临”或“正在显示”数组中选择电影。
  4. 获取该电影的ID并将其发送到相应的DetailsViewController。现在您有了movieID,可以使用它来从数据库中请求电影详细信息。

    func tableView(_ tableView:UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell") as? TableViewCell else { return UITableViewCell() }
    
    switch segmentedControl.selectedSegmentIndex {
    case 0:
        //handle the set up of Upcoming cells
    
    case 1:
       //handle the setup of Showing cells
    
    default:
        break
    }
    return cell  
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    
    switch segmentedControl.selectedSegmentIndex {
    
    case 0:
        let DetailViewUpcoming = self.storyboard?.instantiateViewController(withIdentifier: "DetailViewUpcoming") as! DetailViewUpcoming
    
        DetailViewUpcoming.init(forMovie: upcomingArray[indexPath.row].movieID)
        self.navigationController?.pushViewController(DetailViewUpcoming, animated: true)
    
    
    
    case 1:
        let DetailViewShowing = self.storyboard?.instantiateViewController(withIdentifier: "DetailViewShowing") as! DetailViewShowing
    
        DetailViewShowing.init(forMovie: showingArray[indexPath.row].movieID)
        self.navigationController?.pushViewController(DetailViewShowing, animated: true)
    
    
    default:
        break
    
    }
    }
    
    
    @IBAction func segmentedTapped(_ sender: Any) {
    tableView.reloadData()
    }
    

DetailViewUpcomingDetailViewShowing内部声明movieID的变量并添加初始化程序

var movieID: String?

init(movieID:String){
 self.movieID = movieID
}

现在,当您加载视图时,请使用上面的movieID来请求电影详细信息,并将其分配给您认为合适的属性。

答案 1 :(得分:1)

对于您的问题,我假设以下内容:

  1. 您有一个字符串数组来填充tableView
  2. 您只需要将那个 String传递给下一个View Controller

现在,在将数据(或字符串)发送到下一个View Controller之前,您需要检查2个值

  
      
  1. 用户选择单元格时选择了哪个Segmented Control选项。

  2.   
  3. 所选单元格的Index Path

  4.   

SourceViewController.swift

var upcomingMovies = ["A","B","C"]
var nowShowingMovies = ["D","E","F"]

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

  guard let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell") as? TableViewCell else { return UITableViewCell() }

  switch segmentedControl.selectedSegmentIndex {

     case 0:
        cell.textLabel.text = upcomingMovies[indexPath.row]

     case 1:
        cell.textLabel.text = nowShowingMovies[indexPath.row]

     default:
        break
    }

    return cell  
 }

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

       switch segmentedControl.selectedSegmentIndex {

        case 0: //We check the *first* value here
          let destinationVCObject = self.storyboard?.instantiateViewController(withIdentifier: "destinationVC") as! DestinationViewController

          //We check the *second* value here
          destinationVCObject. movieName = upcomingMovies[indexPath.row] 

          self.navigationController?.pushViewController(destinationVCObject, animated: true)

        case 1: //We check the *first* value here
          let destinationVCObject = self.storyboard?.instantiateViewController(withIdentifier: "destinationVC") as! DestinationViewController

          //We check the *second* value here
          destinationVCObject. movieName = nowShowingMovies[indexPath.row] 

          self.navigationController?.pushViewController(destinationVCObject, animated: true)

        default:
           break

     }
  }


@IBAction func segmentedTapped(_ sender: Any) {
    myTableView.reloadData()
}

DestinationViewController.swift

class DestinationViewController:UIViewController {

@IBOutlet weak var movieNameLabel:UILabel!

var movieName:String?

override func viewDidLoad() {
    super.viewDidLoad()

    movieNameLabel.text = movieName
   }
}

答案 2 :(得分:0)

我已经通过两个功能解决了segue的问题:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "segueIdentifier1" {
            if let indexPath = tableView.indexPathForSelectedRow {
                let destinationController = segue.destination as! UpComingDetailView
                destinationController.moVieName = ArrayOfUpcomingMovieList[indexPath.row]
            }
        }
        else if segue.identifier == "segueIdentifier2" {
            if let indexPath = tableView.indexPathForSelectedRow {
                let destinationController = segue.destination as! NowShowingDetail
                destinationController.moVieName = ArrayOfNowShowingMoVieList[indexPath.row]
            }
        }
    }

在didSelectRow上

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        switch segment.selectedSegmentIndex {
        case 0:
            performSegue(withIdentifier: "segueIdentifier1", sender: indexPath)
            print("segue to DetailViewController1")
        case 1:
            performSegue(withIdentifier: "segueIdentifier1", sender: indexPath)
            print("segue to DetailViewController2")
        default:
            break
        }
    }