0

在我的应用程序中,我有三个关注的视图控制器。第一个包含地图和打开第二个视图控制器的按钮。第二个视图控制器包含一个可搜索的表,然后当用户选择一行时,它会在第三个视图控制器中加载相关数据。这一切都很好!

现在的意图是,当用户在第三个视图控制器中按下 Show on Map 按钮时,它会将数据(在本例中为坐标的两个双精度值)传递回第一个视图控制器,以便第一个视图控制器可以专注于这些坐标。

我已经关注了 Apple 的文档(BirdSighting 教程)以及之前关于 SO 的问题/答案,但我注意到了一个问题。

我真的找不到将第三个视图控制器的委托设置为第一个视图控制器的地方。通常我会在第一个 VC 中输入以下代码,但我不会创建第三个 VC 的实例 - 这发生在第二个 VC 中:

thirdVC.delegate = self;  //set self as the delegate

所以我该怎么做?

谢谢

4

3 回答 3

1

您可以通过 secondViewController 将委托传递给 thirdViewController 或者您可以用户通知中心,例如:

NSString *const NotificationDataChanged = @"NotificationDataChanged";

NSDictionary *someData = @{};

[[NSNotificationCenter defaultCenter] postNotificationName:NotificationDataChanged object:someData];

在 firstViewController 上,您需要观察它,例如在 viewDidLoad 中添加这一行:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(updateUserInfo:)
                                             NotificationDataChanged object:nil];

- (void)updateUserInfo:(NSNotification *)notification
{
    NSDictionary *someData = [notification userInfo];
}

不要忘记在 dealloc 中删除观察者:

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
于 2012-08-27T19:18:34.457 回答
1

委托是完成您需要的众多机制之一。@onnoweb 的建议非常合适,尽管在传递委托指针时会变得混乱。

KVO:您也可以考虑使用 KVO,将数据放入模型对象中,让 VC3 更新模型对象,让 VC1 成为这些值的观察者。

NSNotificationCenter:另一种选择是 NSNotificationCenter

在 VC3 中,使用它来发送广播(设置您的字典以包含您的纬度/经度坐标):

[[NSNotificationCenter defaultCenter] postNotificationName:@"ShowOnMap" object:[NSDictionary dictionaryWithObjects:objects forKey:keys]];

在 VC1 中:

注册接收广播:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onShowOnMap:) name:@"ShowOnMap" object:nil];

并处理广播:

-(void) onShowOnMap:(NSNotification *)notification
{
 NSDictionary *values = [notification object];
 .
 .
 . 
}

并在您的 dealloc 中取消注册

于 2012-08-27T19:19:15.257 回答
0

您可以在 AppDelegate 中存储指向第一个 VC 的指针,以便您可以调用

thirdVC.delegate =[(AppDelegate*)[NSApplication sharedApplication].delegate firstVC];
于 2012-08-27T19:18:39.633 回答