1

老实说,我不知道如何称呼它,所以我将尝试描述它。

UIApplicationDelegate 协议有“application:handleOpenURL:”方法。如果我在我的 ApplicationDelegate 类中实现这个方法,当有人打开我的 url 时它会被调用。

详细信息: http: //developer.apple.com/iphone/library/documentation/uikit/reference/UIApplicationDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/UIApplicationDelegate/application :handleOpenURL :

但是,我希望我的其他班级(uiviewcontroller)收到这个电话。举一个不同的例子——你可以创建几个类,每个类都可以获得 GPS 位置。是否可以对 UIApplicationDelegate 协议做同样的事情?

我在这里搜索了很多这个主题,但我找不到任何关于如何做到这一点的答案。我知道如何获取我的应用程序委托([[UIApplication sharedApplication] delegate]),但在这种情况下并非如此。

4

3 回答 3

3

你总是可以告诉那些从其他面向对象语言来到 Objective-c 的人,因为他们的第一直觉是子类、子类、子类。obj-c 中没有很多子类化。显然,你可以,但这不是传统的做法,尤其是像 UIApplicationDelegate 这样一次性的东西。更多的 Cocoaish 方式是使用类别,或者有时创建一个新的 NSObject 子类,其中包含可能的父类作为属性。

在这种情况下,子类化肯定是个坏主意。UIApplication 单例只能有一个委托属性。所以如果你创建了一个新的 UIApplicationDelegate,你就没有地方去挂它了。

取而代之的是,让您的一个委托的application:handleOpenURL:方法更智能,以捕获 URL 调用并加载要处理它的任何 UIViewController 子类(我知道,我知道:异常)。

于 2010-08-17T13:53:25.157 回答
1

最简单的解决方案是使用 NSNotification。这将允许您在任何需要的地方处理 handleOpenURL 调用,而不会在应用程序委托和要处理它的类之间创建任何不必要的耦合。

在您的应用委托中,处理委托方法并使用 NSNotificationCenter 转发数据。

- (void)application:(UIApplication *)application handleOpenURL:(NSURL *)URL
{
  [[NSNotificationCenter defaultCenter] postNotificationName:@"MyApplicationHandleOpenURLNotification" object:self userInfo:[NSDictionary dictionaryWithObject:URL forKey:@"URL"]];
}

现在,无论您需要在哪里处理此问题,只需注册为通知的观察者并将 URL 从通知用户信息字典中提取出来。

于 2010-08-17T17:45:30.990 回答
1

从您对 Dan Ray 的回答的评论来看,听起来您正在寻找诸如Three20 的基于 URL 的导航之类的东西

于 2010-08-17T17:49:02.397 回答