我在地图rightCalloutAccessory
有很多注释(带有rightCalloutAccessory
按钮)。 该按钮将从此mapview
到tableview
。 我想根据单击哪个标注按钮将不同的对象(包含数据)传递给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
}
}
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3170974