选择UITableViewCell时如何进行推送segue

时间:2014-03-31 10:25:46

标签: ios objective-c uitableview segue

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

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

10 个答案:

答案 0 :(得分:175)

control 从View Controller拖动到View Controller

From View Controller to View Controlle!

您需要为您的segue提供一个标识符:

enter image description here

执行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
    }
}

答案 1 :(得分:45)

夫特

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

以下是如何设置项目。

  • 使用TableView创建项目。有关简单示例,请参阅here
  • 添加第二个ViewController
  • 控制从具有表视图的第一个视图控制器拖动到第二个视图控制器。选择"显示"作为segue类型。

enter image description here

  • 单击情节提要中的segue,然后在属性检查器中命名标识符" yourSegue"。 (您可以随意调用它,但您还需要在代码中使用相同的名称。)

enter image description here

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

代码

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

有关在视图控制器之间传递数据的更基本示例,请参阅this answer

答案 2 :(得分:44)

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

答案 3 :(得分:13)

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

答案 4 :(得分:5)

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

答案 5 :(得分:3)

你有2个选项:ctrl +从原型单元格拖动到新的vc,然后你将从每个单元格中删除,你必须实现为segue做准备。

第二个选项,在didselectrowatindexpath中你可以使用self.storyboard instantiateviewcontrollerwithidentifier ...来实例化你的新viewcontroller,然后调用pushviewcontroller或presentviewcontroller,在这个场景中你不需要故事板中的segue或准备segue。

答案 6 :(得分:2)

您可以使用此方法:

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

您可以在此处执行选择特定tableview单元格的功能。

答案 7 :(得分:0)

您可以通过以下方法执行此操作:

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

- (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];

通过这个,你可以在选择UITableViewCell时实现推送segue。

希望这可以帮助你......!

答案 8 :(得分:0)

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

答案 9 :(得分:0)

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {

    [self performSegueWithIdentifier:@"segueIdentifier" sender:indexPath];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"segueIdentifier"]) {
        NSIndexPath *indexPath = (NSIndexPath *)sender;

    }
}