繁体   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