【问题标题】:Swift: How to perform Segue for different UITableViewCell to different ViewController?Swift:如何为不同的 UITableViewCell 执行 Segue 到不同的 ViewController?
【发布时间】:2016-08-22 09:50:13
【问题描述】:

我有一个HomePageTableViewController,其中包含三个自定义的TableViewCell,每个TableViewCell 都包含一个UICollectionView。当用户点击每个TableViewCell 并转到不同的ViewController 以显示CollectionView 的详细信息时,我想执行segue。我使用了这段代码:

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。我怎样才能做到这一点?

【问题讨论】:

    标签: ios swift uitableview segue


    【解决方案1】:
        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.
    

    【讨论】:

    • 这将引导我到不同的视图控制器,但是,由于我在self.prepareSegueWithIdentifier 内部做了self.prepareSegueWithIdentifier func selectedPost,这样我就可以从单元格中获取数据并将其传递给细节视图控制器,这个解决方案可以做到吗?谢谢
    【解决方案2】:

    从您的代码看来,您已经创建了一个协议并在所有 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
        }
    }
    

    【讨论】:

    • 首先谢谢。我有一个问题,prepareForSegue 怎么样,我应该如何选择哪个ViewController 作为destinationViewController?谢谢
    • 为此,您只需使用segue.identifier,查看我编辑的答案。
    • 现在,因为我没有在 secondViewController 中实现任何东西,但它成功地按我的意愿工作,我将尝试在 secondViewController 中添加一些代码以查看它是否有效。谢谢
    • 欢迎朋友,编码愉快:)
    • 我正在将此解决方案应用于另一种情况,当我点击单元格时,didSelectedItemAtIndexPath 工作,但它不会执行 segue,你知道我可能忘记在哪里添加吗? @NDoc
    【解决方案3】:

    如果您使用委托方法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)
        }
    }
    

    【讨论】:

    • 你能详细解释一下吗,对不起,我是 Swift 新手。谢谢
    • 对于您目前的解决方案,@Avinash Mishra 的答案将起作用,但是如果您开始在一个部分中将具有不同重用标识符的单元格组合起来,那么我的答案将是更好的解决方案。
    • 现在我在func selectedPost中使用self.performSegueWithIdentifier,所以我不能在didSelectRowAtIndexPath中使用它。
    • @LeoGuo 实际上,如果您想使用 prepareForSegue 方法,请使用我的解决方案,因为使用 presentViewController 会立即显示 viewController,您将无法设置任何变量。
    • @LeoGuo 您使用该功能是否有特定原因?如果不是,您可以将该代码移动到 didSelectRowAtIndexPath 中,因为当您点击一行时会自动调用该代码。
    【解决方案4】:

    您需要覆盖方法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 而不是switchif else,因为对我来说它看起来更好,你可以使用任何你想定义哪个单元格被按下的东西。希望对你有帮助...

    【讨论】:

    • 现在,goToDetail segue 连接在HomePageTableViewControllerDetailTableViewController 之间。你是什​​么意思“每个segue应该从一个控制器到另一个控制器,而不是从表视图到控制器”?你的意思是我需要将segue从不同的单元格拖到视图控制器,而不是从表视图控制器到视图控制器?谢谢
    • 据我了解,您需要显示三个不同的控制器与按下的单元格不同。
    • 每个控制器需要三个segue,三个控制器不能有一个segue。
    • 是的,我有三个不同的 segue 和不同的标识符,但我如何决定使用哪一个。因为在HomePageTableviewController 中,我有一个func selectedPost(post: Posts) { self.performSegueWithIdentifier("goToDetail", sender: post) } 从每个TableViewCell 内部的CollectionView 获取数据。所以我想我需要在这个函数中选择 segue 标识符。
    • 谢谢,我会看看并尝试理解,因为我是 swift 新手,谢谢。
    猜你喜欢
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 2015-02-16
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多