如何在selectUITableViewCell时进行推送

我有一个表视图中的效果列表。 我已经创build了一个右上angular的button,它可以推到另一个视图控制器,这有助于创build一个新的效果。 现在,我想将push segues添加到表格视图单元格,以便可以将效果值加载到添加效果视图控制器上,并且可以保存编辑的值。

问题是我可以通过编程创build一个push segue吗? 如果不是的话,我可以通过一个prepareforsegue来传递效果吗? 如果我尝试使用prepareforsegue ,我遇到了一个问题,从UITableView控件拖放不会让我创build一个推继续添加效果视图控制器。

控制拖动从视图控制器到视图控制器

从视图控制器到视图控制!

你将需要给你的segue一个标识符:

在这里输入图像描述

执行segue:

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

现在这里是事情,如果你需要传递一些数据到视图控制器,这将只执行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 } } 

这是另一个选项,不需要使用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 } } } 

迅速

这个答案显示了如何传递数据,并更新为Xcode 8和Swift 3。

这是如何设置项目。

  • 使用TableView创build一个项目。 这里看一个简单的例子。
  • 添加第二个ViewController
  • 使用表视图控制从第一个视图控制器拖到第二个视图控制器。 select“显示”作为seguetypes。

在这里输入图像描述

  • 单击故事板中的segue,然后在Attribute Inspector中标识标识符“yourSegue”。 (你可以任意调用它,但是你也需要在代码中使用相同的名字。)

在这里输入图像描述

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

具有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" } } 

第二视图控制器

 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) } } 

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

 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [self performSegueWithIdentifier:@"YourPushSegueName" sender:self]; } 
 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { MyViewController *myVController = (MyViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"StoryBordIdentifier"]; [self.navigationController pushViewController:myVController animated:YES]; } 

你有2个select:ctrl +从原型单元格拖动到新的vc,然后你将从每个单元格继续,你必须实现准备for segue。

第二个选项,在didselectrowatindexpath中,您可以使用self.storyboard instantiateviewcontroller withidentifier …实例化您的新viewcontroller,然后调用pushviewcontroller或presentviewcontroller,在这种情况下,您不需要在storyboard中进行segues或准备segue。

你可以使用这个方法:

 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

你可以在这里select一个特定的tableview单元格来执行一个function。

你可以通过以下方法来做到这一点:

首先,您需要在当前视图中导入另一个视图控制器。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {}

在上面的方法里面你必须调用一个方法- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated; 喜欢这个:

 yourViewController = [[YourViewController alloc] initWithNibName:@"YourViewController" bundle:nil]; [self.navigationController YourViewController animated:YES]; 

通过这个,你可以在selectUITableViewCell时候实现push segue。

希望这可以帮助你…!

Swift 3

在跟随了Ahmed Daou的回答之后 – >手动将segue从vc拖到故事板上的vc

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { self.performSegue(withIdentifier: "SegueIdentifier", sender: nil) } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "SegueIdentifier" { //do something you want } }