如何传递prepareForSegue:一个对象

旧巷老猫 提交于 2020-02-28 06:02:22

我在地图rightCalloutAccessory有很多注释(带有rightCalloutAccessory按钮)。 该按钮将从此mapviewtableview 。 我想根据单击哪个标注按钮将不同的对象(包含数据)传递给tableview

例如:(全部组成)

  • 注解1(Austin)->传递数据obj 1(与Austin相关)
  • 注解2(达拉斯)->传递数据obj 2(与达拉斯相关)
  • 注解3(休斯敦)->传递数据obj 3,依此类推...(你明白了)

我能够检测到单击了哪个标注按钮。

我正在使用prepareForSegue :将数据obj传递到目标ViewController 。 由于无法进行此调用,因此无法为我需要的数据obj加上额外的参数,因此有什么优雅的方法可以实现相同的效果(动态数据obj)?

任何提示将不胜感激。


#1楼

有时,避免在两个视图控制器之间创建编译时依赖性很有帮助。 在不关心目标视图控制器类型的情况下,可以按照以下方法进行操作:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.destinationViewController respondsToSelector:@selector(setMyData:)]) {
        [segue.destinationViewController performSelector:@selector(setMyData:) 
                                              withObject:myData];
    } 
}

因此,只要您的目标视图控制器声明了公共属性,例如:

@property (nonatomic, strong) MyData *myData;

您可以如上所述在先前的视图控制器中设置此属性。


#2楼

我有一个发送者类 ,像这样

@class MyEntry;

@interface MySenderEntry : NSObject
@property (strong, nonatomic) MyEntry *entry;
@end

@implementation MySenderEntry
@end

我使用此发送器类来传递对象以准备prepareForSeque:sender:

-(void)didSelectItemAtIndexPath:(NSIndexPath*)indexPath
{
    MySenderEntry *sender = [MySenderEntry new];
    sender.entry = [_entries objectAtIndex:indexPath.row];
    [self performSegueWithIdentifier:SEGUE_IDENTIFIER_SHOW_ENTRY sender:sender];
}

-(void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:SEGUE_IDENTIFIER_SHOW_ENTRY]) {
        NSAssert([sender isKindOfClass:[MySenderEntry class]], @"MySenderEntry");
        MySenderEntry *senderEntry = (MySenderEntry*)sender;
        MyEntry *entry = senderEntry.entry;
        NSParameterAssert(entry);

        [segue destinationViewController].delegate = self;
        [segue destinationViewController].entry = entry;
        return;
    }

    if ([[segue identifier] isEqualToString:SEGUE_IDENTIFIER_HISTORY]) {
        // ...
        return;
    }

    if ([[segue identifier] isEqualToString:SEGUE_IDENTIFIER_FAVORITE]) {
        // ...
        return;
    }
}

#3楼

我在UIViewController上实现了带有类别的库,该库可简化此操作。 基本上,您可以在与执行Segue的UI项相关联的NSDictionary中设置要传递的参数。 它也适用于手动搜索。

例如,您可以

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

用于手动搜索或创建带有搜索的按钮并使用

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

如果目标视图控制器不符合键的键值编码,则不会发生任何事情。 它也可以与键值一起使用(对于放松序列很有用)。 在这里查看https://github.com/stefanomondino/SMQuickSegue


#4楼

对于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!

    }
}

#5楼

在Swift 4.2中,我会做类似的事情:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let yourVC = segue.destination as? YourViewController {
        yourVC.yourData = self.someData
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!