我是iOS开发的新手。我希望得到帮助,如果我的问题过于基本,也表示歉意。
我刚刚习惯UITableViewController
和委托数据源。
当用户触摸segmentedController内部时,TableViewCell将重新加载数据以显示正在播放的电影和即将上映的电影(仅为我的学习目的而设计的一个简单的电影预订应用程序)。
我发现对多个视图的排序存在问题。
当用户选择单元格时。
如何为每个重载数据分配标识符,以便在单击单元格时将数据传递到另一个ViewController(例如:DetailViewUpcoming
和DetailViewShowing
)。在这里,我还有另外两个ViewController来记录有关即将上映的电影和显示电影的详细信息(图像,名称,日期和反向按钮.... etc)
如果可能,我只需要想法方面的帮助。或代码说明非常好。尽管我尝试在功能中实现segue:tableview(_tableView:UITableView,didSelectRowAt indexPath:IndexPath),但我的程序未按预期执行。因为我在segmentedControll上遇到麻烦(我想这是问题所在)
我之前已经阅读过此post
谢谢大家
答案 0 :(得分:1)
您需要实现的逻辑是:
获取该电影的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()
}
在DetailViewUpcoming
和DetailViewShowing
内部声明movieID的变量并添加初始化程序
var movieID: String?
init(movieID:String){
self.movieID = movieID
}
现在,当您加载视图时,请使用上面的movieID
来请求电影详细信息,并将其分配给您认为合适的属性。
答案 1 :(得分:1)
对于您的问题,我假设以下内容:
tableView
String
传递给下一个View Controller
现在,在将数据(或字符串)发送到下一个View Controller
之前,您需要检查2个值
用户选择单元格时选择了哪个
Segmented Control
选项。所选单元格的
Index Path
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
}
}