簡體   English   中英

Swift:如何針對不同的ViewController執行不同UITableViewCell的Segue?

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

現在改變HomePageTableViewControllerselectedPost方法的實現

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM