我在mapview中有许多注释(与rightCalloutAccessory按钮)。该按钮将执行一个从mapview到tableview的segue。我想传递给tableview一个不同的对象(持有数据),这取决于哪个callout按钮被单击。

例如:(完全是瞎编的)

注释1 (Austin) ->传递数据obj 1(与Austin相关) 注释2(达拉斯)->传递数据obj 2(有关达拉斯) 注释3(休斯顿)->传递数据obj 3等等…(你会得到 主意)

我能够检测到哪个调出按钮被单击。

我使用prepareForSegue:来传递数据对象到目标ViewController。由于我不能使这个调用为我需要的数据对象额外的参数,有什么优雅的方法来实现相同的效果(动态数据对象)?

任何建议都将不胜感激。


当前回答

我在UIViewController上实现了一个类库,简化了这个操作。 基本上,你在NSDictionary中设置你想要传递的参数与执行segue的uiitem关联。它也适用于手动segue。

例如,你可以这样做

[self performSegueWithIdentifier:@"yourIdentifier" parameters:@{@"customParam1":customValue1, @"customValue2":customValue2}];

对于手动segue或者创建一个带有segue的按钮并使用

[button setSegueParameters:@{@"customParam1":customValue1, @"customValue2":customValue2}];

如果目标视图控制器不符合键的键值编码,什么都不会发生。它也适用于键值(对unwind segue很有用)。 点击这里查看 https://github.com/stefanomondino/SMQuickSegue

其他回答

只需要在prepareForSegue:方法中获取一个对目标视图控制器的引用,并将你需要的任何对象传递到那里。这里有一个例子……

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Make sure your segue name in storyboard is the same as this line
    if ([[segue identifier] isEqualToString:@"YOUR_SEGUE_NAME_HERE"])
    {
        // Get reference to the destination view controller
        YourViewController *vc = [segue destinationViewController];

        // Pass any objects to the view controller here, like...
        [vc setMyObjectHere:object];
    }
}

修改:您还可以使用performSegueWithIdentifier:sender:方法来激活基于选择或按钮按下的转换到新视图。

例如,假设我有两个视图控制器。第一个包含三个按钮,第二个需要知道在转换之前按下了哪个按钮。你可以在代码中使用performSegueWithIdentifier:方法将按钮连接到IBAction,就像这样…

// When any of my buttons are pressed, push the next view
- (IBAction)buttonPressed:(id)sender
{
    [self performSegueWithIdentifier:@"MySegue" sender:sender];
}

// This will get called too before the view appears
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"MySegue"]) {

        // Get destination view
        SecondView *vc = [segue destinationViewController];

        // Get button tag number (or do whatever you need to do here, based on your object
        NSInteger tagIndex = [(UIButton *)sender tag];

        // Pass the information to your destination view
        [vc setSelectedButton:tagIndex];
    }
}

编辑:我最初附上的演示应用程序现在已经有6年了,所以我删除了它以避免任何混淆。

在Swift 4.2中,我会这样做:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let yourVC = segue.destination as? YourViewController {
        yourVC.yourData = self.someData
    }
}

用这个函数。

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let index = CategorytableView.indexPathForSelectedRow
    let indexNumber = index?.row
    let VC = segue.destination as! DestinationViewController
   VC.value = self.data

}

我在UIViewController上实现了一个类库,简化了这个操作。 基本上,你在NSDictionary中设置你想要传递的参数与执行segue的uiitem关联。它也适用于手动segue。

例如,你可以这样做

[self performSegueWithIdentifier:@"yourIdentifier" parameters:@{@"customParam1":customValue1, @"customValue2":customValue2}];

对于手动segue或者创建一个带有segue的按钮并使用

[button setSegueParameters:@{@"customParam1":customValue1, @"customValue2":customValue2}];

如果目标视图控制器不符合键的键值编码,什么都不会发生。它也适用于键值(对unwind segue很有用)。 点击这里查看 https://github.com/stefanomondino/SMQuickSegue

对于Swift来说,

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    var segueID = segue.identifier

    if(segueID! == "yourSegueName"){

        var yourVC:YourViewController = segue.destinationViewController as YourViewController

        yourVC.objectOnYourVC = setObjectValueHere!

    }
}