[英]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.