2012-08-27 35 views
0

在我的应用程序中,我有三个关注的视图控制器。第一个包含一个地图和一个按钮来打开第二个视图控制器。第二个视图控制器包含一个可搜索的表格,然后当用户选择一行时,它将在第三个视图控制器中加载相关数据。这一切运作良好!iOS:委托VC不直接连接到其他VC的委托困境

现在的意图是,当用户在第三个视图控制器中按下显示映射按钮时,它会将数据(在这种情况下为坐标的两个双值)传回第一个视图控制器,以便第一个视图控制器可以将焦点放在这些坐标上。

我跟着苹果的文档(BirdSighting教程)以及以前的问题/答案,但我注意到一个问题。

我真的找不到一个地方设置第三个viewcontroller的委托是第一个视图控制器。通常,我会进入第一个VC下面的代码,但我没有创造第三VC的一个实例 - 这发生在第二个:

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

那么,应该怎么办?

感谢

+0

一种方法是firstVC传递给secondVC然后将其设置为thirdVC的委托。 – onnoweb

回答

1

代表你可以存储指向第一个VC是多种机制来完成你所需要的一个。 @onnoweb的建议非常合适,但这可能会让代理指针变得杂乱无章。

KVO: 您还可以考虑KVO,将数据放入模型对象,让VC3更新模型对象,并将VC1作为这些值的观察者。

NSNotificationCenter: 另一种方法是NSNotificationCenter

在VC3

,用它来发送一个广播(设置你的字典包含您的纬度/经度坐标):

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

注册以接收广播:

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

和处理广播:

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

,并注销在的dealloc

+0

非常感谢。我想我会试用NSNotificationCenter。我会先尝试一些基本教程,以便更好地理解,但是我会尝试一下代码。再次感谢。 –

+0

还有一件事:当涉及到NSDictionary时,我应该如上所述使用dictionaryWithObject:forKey:还是dictionaryWithObjects?我问,因为我需要传输坐标,但都似乎需要一个数组。我是否创建了一个坐标对象的数组并传递它? –

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]; 
} 
0

在你的appdelegate,这样你可以调用

thirdVC.delegate =[(AppDelegate*)[NSApplication sharedApplication].delegate firstVC];