didFinishLaunching永远不会被调用

sta*_*rob 1 iphone objective-c ios

我创建了一个新的基于窗口的项目,无法弄清楚为什么它没有做任何事情.最后我在didFinishLaunching之后立即放置了一个NSLog,当我运行它时它永远不会被记录.这是我写的所有代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSLog(@"didFinishLaunching");

    // Get the device object and turn proximity monitoring on
    UIDevice *d = [UIDevice currentDevice];
    [d setProximityMonitoringEnabled:YES];

    // Get the NSNotificationCenter object
    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];

    // Sign up to receive notifications when the proximity state changes
    [nc addObserver:self selector:@selector(proximityChanged:) name:UIDeviceProximityStateDidChangeNotification object:d];
    NSLog(@"Observing...");

    [self.window makeKeyAndVisible];
    return YES;

}

- (void)proximityChanged:(NSNotification *)note {

    // Print out the changes of proximity state
    NSLog(@"Proximity Changed: %d", [[note object] proximityState]);

}
Run Code Online (Sandbox Code Playgroud)

这是我写的全部内容,当我在模拟器或设备上运行时,没有记录任何内容.有什么想法吗?

小智 7

那么,你在谈论应用代表.显而易见的原因 - 您的对象未设置为应用程序委托.

查看Apple文档,有很多方法可以实现它:

  1. 在Interface Builder中删除应用程序委托绑定(窗口的.xib文件)
  2. 将main.h中的UIApplicationMain的第4个参数设置为nil以外的其他参数.

检查Interface Builder中的nib文件,看看是否已设置App Delegate.

参考文档 核心应用程序设计

应用程序委托是您在应用程序启动时提供的自定义对象,通常通过将其嵌入应用程序的主nib文件中.该对象的主要工作是初始化应用程序并在屏幕上显示其窗口.UIApplication对象还会在特定应用程序级事件发生时通知此对象,例如当应用程序需要中断(由于传入消息)或移动到后台时(因为用户点击了Home按钮).


第四个参数标识应用程序委托的类.应用程序委托负责管理系统与自定义代码之间的高级交互.指定nil告诉UIKit应用程序委托对象位于应用程序的主nib文件中(使用Xcode模板构建的应用程序就是这种情况).