选择UITableViewCell时如何进行推送segue

Avi*_*pai 61 objective-c uitableview ios segue

我在表格视图中有一个效果列表.我创建了一个右上角的条形按钮,它可以将push segue推送到另一个视图控制器,这有助于创建一个新的效果.现在我想将push segues添加到表格视图单元格中,以便可以在添加效果视图控制器上加载效果值,我可以保存已编辑的值.

问题是我可以通过编程方式创建push segue吗?如果没有,我可以通过一个prepareforsegue?如果我尝试使用一个prepareforsegue,我遇到一个问题,控制拖动从UITableView不让我创建推送segue到添加效果视图控制器.

med*_*eda 177

control 从View Controller拖动到View Controller

从View Controller到View Controlle!

您需要为segue指定一个标识符:

在此输入图像描述

执行segue:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self performSegueWithIdentifier:@"yourSegue" sender:self];
}
Run Code Online (Sandbox Code Playgroud)

现在就是这个,如果您需要将一些数据传递给该视图控制器,这将只执行segue.然后你必须实现以下segue委托:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Make sure your segue name in storyboard is the same as this line
    if ([[segue identifier] isEqualToString:@"yourSegue"])
    {
        //if you need to pass data to the next controller do it here
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @亚历山大抱歉我的延迟响应我在mac上使用quicktime来录制视频然后我使用这个[网站](https://imgflip.com/gifgenerator)转换为Gif然后我加载到imgur (9认同)
  • 嘿@meda,你能告诉我你用什么工具在帖子中创建gif吗?这非常适合描述事物! (4认同)
  • 我知道这是一个非常古老的线程,但对于这些gif截屏视频,[LICECap](http://www.cockos.com/licecap/)非常棒 - 而且速度更快. (2认同)

Sur*_*gch 48

迅速

这个答案显示了如何传递数据,并针对Xcode 8和Swift 3进行了更新.

以下是如何设置项目.

  • 使用a创建项目TableView.请看这里的简单示例.
  • 添加一秒ViewController.
  • 控制从具有表视图的第一个视图控制器拖动到第二个视图控制器.选择"显示"作为segue类型.

在此输入图像描述

  • 单击故事板中的segue,然后在Attribute Inspector中单击标识符"yourSegue".(您可以随意调用它,但您还需要在代码中使用相同的名称.)

在此输入图像描述

  • (可选)您可以通过选择故事板中的第一个视图控制器并转到编辑器>嵌入>导航控制器,将所有内容嵌入到导航控制器中.

使用TableView的第一个视图控制器:

import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    // ...


    // method to run when table view cell is tapped
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        // Segue to the second view controller
        self.performSegue(withIdentifier: "yourSegue", sender: self)
    }

    // This function is called before the segue
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        // get a reference to the second view controller
        let secondViewController = segue.destination as! SecondViewController

        // set a variable in the second view controller with the data to pass
        secondViewController.receivedData = "hello"
    }
}
Run Code Online (Sandbox Code Playgroud)

第二视图控制器

class SecondViewController: UIViewController {

    @IBOutlet weak var label: UILabel!

    // This variable will hold the data being passed from the First View Controller
    var receivedData = ""

    override func viewDidLoad() {
        super.viewDidLoad()

        print(receivedData)
    }
}
Run Code Online (Sandbox Code Playgroud)

有关在View Controllers之间传递数据的更基本示例,请参阅此答案.


skw*_*hua 47

这是另一个选项,不需要使用didSelectRowAtIndexPath.

您只需将Interface Builder中的segue从原型单元连接到目标.

从那里你可以简单地:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "AffiliationDetail", let destination = segue.destinationViewController as? AffiliateDetailViewController {
        if let cell = sender as? UITableViewCell, let indexPath = tableView.indexPathForCell(cell) {
            var affiliation = affiliations[indexPath.row]
            destination.affiliation = affiliation
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


May*_*ain 13

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self performSegueWithIdentifier:@"YourPushSegueName" sender:self];
}
Run Code Online (Sandbox Code Playgroud)


Vin*_* TP 5

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    MyViewController *myVController = (MyViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"StoryBordIdentifier"];
    [self.navigationController pushViewController:myVController animated:YES];
}
Run Code Online (Sandbox Code Playgroud)