[英]Swift: How to perform Segue for different UITableViewCell to different ViewController?
我有一个HomePageTableViewController
,它包含三个自定义的TableViewCell
,每个TableViewCell
包含一个UICollectionView
。 我想在用户点击每个TableViewCell
时执行segue并转到不同的ViewController
以显示CollectionView
的细节。 我用过这段代码:
import UIKit
class HomePageTableViewController: UITableViewController, PostDelegate {
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 3
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
if indexPath.section == 0 {
let cell = tableView.dequeueReusableCellWithIdentifier("TableViewCell1") as! HomePageTableViewCell1
cell.getCategory()
// cell.scrollToNextCell()
// cell.startTimer()
cell.postDelegate = self
tableView.rowHeight = 260
return cell
}
else if indexPath.section == 1 {
let cell = tableView.dequeueReusableCellWithIdentifier("TableViewCell2") as! HomePageTableViewCell2
cell.getCategory()
tableView.rowHeight = 140
return cell
}
else {
let cell = tableView.dequeueReusableCellWithIdentifier("TableViewCell3") as! HomePageTableViewCell3
cell.getCategory()
tableView.rowHeight = 470
return cell
}
}
func selectedPost(post: Posts) {
//You will get your post object here, do what you want now
self.performSegueWithIdentifier("goToDetail", sender: post)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let post = sender as! Posts
let postDetailPage = segue.destinationViewController as? DetailTableViewController
postDetailPage!.passPost = post
}
这段代码完成了我所点击的TableViewCell
的工作,它转到了具有标识符“goToDetail”的相同segue。 例如,对于HomeTableTableViewCell2
,我想执行带有标识符“goToDetail2”的segue,依此类推。 我怎样才能做到这一点?
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if indexPath.section == 0 {
let myWebView = self.storyboard!.instantiateViewControllerWithIdentifier(" Your ViewController") as! Your ViewController
self.presentViewController(myWebView, animated: true, completion: nil)
}
if indexPath.section == 1 {
let myWebView = self.storyboard!.instantiateViewControllerWithIdentifier(" Your ViewController") as! Your ViewController
self.presentViewController(myWebView, animated: true, completion: nil)
}
if indexPath.section == 2 {
let myWebView = self.storyboard!.instantiateViewControllerWithIdentifier("Your ViewController") as! Your ViewController
self.presentViewController(myWebView, animated: true, completion: nil)
}
}
Hope It Help. Thanks.
从查看代码看起来您创建了一个协议并在所有3个CustomTableView
单元中创建了实例。 之后,您将在选择collectionView时调用该委托方法。
要解决您的问题,只需使用您的协议方法再创建一个Int
类型的参数,并使用它传递CustomTableView
索引。
所以现在你的协议PostDelegate
看起来像这样。
protocol PostDelegate {
func selectedPost(post: Posts, index: Int)
//Others method if you have
}
现在就像这样从不同的单元格中调用这些方法
在HomePageTableViewCell1
self.postDelegate.selectedPost(post: post, index: 0)
在HomePageTableViewCell2
self.postDelegate.selectedPost(post: post, index: 1)
在HomePageTableViewCell3
self.postDelegate.selectedPost(post: post, index: 2)
现在改变HomePageTableViewController
的selectedPost
方法的实现
func selectedPost(post: Posts, index: Int) {
if (index == 0) {
self.performSegueWithIdentifier("goToDetail", sender: post)
}
else if (index == 1) {
//Perform segue with Second ViewController
}
else {
//Perform segue with Third ViewController
}
}
编辑:要知道你在prepareForSegue
执行了哪个segue,你可以使用segue.identifier
。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if (segue.identifier == "goToDetail") {
let post = sender as! Posts
let postDetailPage = segue.destinationViewController as? DetailTableViewController
postDetailPage!.passPost = post
}
else if (segue.identifier == "secondViewSegue") {
let post = sender as! Posts
let postDetailPage = segue.destinationViewController as? SecondViewController
postDetailPage!.passPost = post
}
else {
let post = sender as! Posts
let postDetailPage = segue.destinationViewController as? ThirdViewController
postDetailPage!.passPost = post
}
}
您需要覆盖方法didSelectCell:atIndexPath
。 在那里你应该检查哪个细胞被按下(第一秒等...)。 之后,您需要在控制器中有三个segue(每个segue应该从一个控制器到另一个控制器,而不是从表视图到控制器)。 确定下一个控制器后,可以调用将显示所需控制器的方法perfromSegueWithIdentifier
。
func tableView(tableView: UITableView, didSelectCell cell: UITableViewCell onIndexPath indexPath: NSIndexPath) {
if let identifier: String? = [0 : "Identifier1", 1 : "identifier2", 2 : "identifier3"][indexpath.row] {
self.perforSegueWithIdentifier[identifier]
}
}
这段代码写得很快,没有检查它的语义正确性,所以它可能有一些问题。 但它应该可以帮助你理解我在说什么。 我也使用了switch
Dictionary
intead或if else
因为对我来说它看起来更好,你可以使用你想要定义哪个单元被按下的任何东西。 希望能帮助到你...
如果使用委托方法tableView(_:didSelectRowAt:)
您将收到indexPath。 一旦你有了这个,通过调用self.tableView.cellForRowAtIndexPath(indexPath)
来使用它来获取你所使用的单元格。 之后,您可以获得重用标识符(cell.reuseIdentifer),然后执行if / else以执行正确的segue。
例:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let cell = tableView.cellForRowAtIndexPath(indexPath)
if (cell.reuseIdentifer == "TableViewCell1")
{ //Do segue one
self.performSegueWithIdentifier("goToDetail", sender: post)
}
else if(cell.reuseIdentifer == "TableViewCell2")
{ //Do segue 2
self.performSegueWithIdentifier("goToDetail2", sender: post)
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.