我有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,依此类推。我怎样才能做到这一点?
答案 0 :(得分:2)
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.
答案 1 :(得分:1)
从查看代码看起来您创建了一个协议并在所有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)
现在改变selectedPost
内部HomePageTableViewController
方法的实现,就像这样
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
}
}
答案 2 :(得分:0)
您需要覆盖方法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]
}
}
这段代码写得很快而没有检查它的语义正确性,所以它内部可能会有一些问题。但它应该可以帮助你理解我在说什么。我也使用了Dictionary
或switch
的{{1}} intead,因为对我来说它看起来更好,你可以使用任何你想要定义按下哪个单元格的东西。希望它有所帮助...
答案 3 :(得分:0)
如果使用委托方法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)
}
}