Swift:如何针对不同的ViewController执行不同UITableViewCell的Segue?

时间:2016-08-22 09:50:14

标签: ios swift uitableview segue

我有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,依此类推。我怎样才能做到这一点?

4 个答案:

答案 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]
    }
}

这段代码写得很快而没有检查它的语义正确性,所以它内部可能会有一些问题。但它应该可以帮助你理解我在说什么。我也使用了Dictionaryswitch的{​​{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)
    }
}