Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么在我的NSApplicationLegate类中从未调用applicationWillFinishLaunching?_Objective C_Cocoa_Xcode_Delegates - Fatal编程技术网

Objective c 为什么在我的NSApplicationLegate类中从未调用applicationWillFinishLaunching?

Objective c 为什么在我的NSApplicationLegate类中从未调用applicationWillFinishLaunching?,objective-c,cocoa,xcode,delegates,Objective C,Cocoa,Xcode,Delegates,main.m 我也尝试了“applicationWillFinishLaunching”,但仍然没有成功。任何帮助都将不胜感激。谢谢。您应该在Interface Builder中将您的CoolClass定义为应用程序委托(Ctrl+从应用程序实例拖动到您的CoolClass实例ApplicationIDFinishLaunching是一个实例方法,而不是类方法。也就是说,您需要类的实例化来接收该消息。此外,它不能只是任何实例化;您的应用程序需要了解您的实例化并知道它的支持。)sed向它发送代理消

main.m


我也尝试了“applicationWillFinishLaunching”,但仍然没有成功。任何帮助都将不胜感激。谢谢。

您应该在Interface Builder中将您的
CoolClass
定义为应用程序委托(Ctrl+从应用程序实例拖动到您的CoolClass实例

ApplicationIDFinishLaunching
是一个实例方法,而不是类方法。也就是说,您需要类的实例化来接收该消息。此外,它不能只是任何实例化;您的应用程序需要了解您的实例化并知道它的支持。)sed向它发送代理消息。最简单和最常用的方法是

首先,您将实例化CoolClass。在Interface Builder中打开应用程序的MainMenu.nib文件。将一个“对象”(看起来像一个蓝色立方体)拖出库窗口。选择它并使用Inspector的Identity选项卡将其类从NSObject更改为CoolClass。现在,您有了一个CoolClass的实例


现在,您将该实例设置为应用程序的委托。控制从“应用程序”(仍在Interface Builder中)拖动到CoolClass的新实例。将弹出一个窗口(显示可连接到对象的应用程序的出口)。选择“委托”。现在,您的应用程序将CoolClass的一个实例设置为其委托,因此,
ApplicationIDFinishLaunching
将运行。

您缺少的是,采用该协议可以使CoolClass类型的对象准备好作为任何非应用程序对象的委托运行(前提是您遵循声明并实现协议的所有必需方法)。声明与协议的一致性还可以防止在将类的实例设置为应用程序的委托时出现编译器警告

但是,为了让特定的应用程序对象(例如,Cocoa为您创建的共享NSApplication对象)知道如何将消息从协议发送到特定的CoolClass对象,您必须将要接收这些消息的对象设置为特定应用程序对象的委托

这意味着,在应用程序发送您想要接收的消息之前,需要实例化一个CoolClass对象(称之为
c
),并告诉应用程序,“嘿,您的代理在这里,所以从现在开始将代理消息发送给小家伙。”

归结起来,这些代码行必须在应用程序完成启动之前执行:

#import "CoolClass.h"

@implementation CoolClass
- (void) applicationDidFinishLaunching : (NSNotification *) aNotification {
    NSLog(@"THIS SHOULD BE PRINTED TO THE DEBUG CONSOLE");
}

@end
实现这一点的最简单方法是让Interface Builder为您完成这项工作:让Main菜单nib实例化您的CoolClass,并按照其他人的建议,在加载nib时将cool class对象设置为应用程序的委托


要执行此操作,请打开MainMenu.xib。将自定义对象拖动到xib中,并在inspector中将其类更改为CoolClass。按住Ctrl键将xib中的应用程序对象拖动(或右键单击拖动)到CoolClass对象,然后选择“委派”。保存、构建和运行。

我很感激您可能试图从头开始学习,但为什么您不使用一个XCode模板创建一个新项目呢?它为您设置了所有这些。生活需要足够的调试,而无需在上面添加更多内容!

从一开始:您对
NSApplicationMain应该包装在一个
NSApp自动释放池中
。如果不这样做,您将遇到麻烦。

或者,您可以调用
[NSApp setDelegate:self]如果您想以编程方式进行操作,请使用
-init
-init
方法。啊,刚才看到了上面的评论。我会尝试一下。我目前有:CoolClass.m#import“CoolClass.h”@implementation CoolClass-(void)init{[NSApp setDelegate:self];NSLog(@“这应该打印到调试控制台”)}@end但它仍然不会运行。我也修改了CoolClass.h来反映这一点。我被上面的答案弄糊涂了。我应该拖动什么,在哪里?拖动[对象]从interface builder中的组件库到main menu.xib。然后在identity inspector中将其类设置为CoolClass。然后执行ctrl+拖动技巧。如果您采用或未实现
-applicationdFinishLaunching
(带有选择器@selector的实例方法(applicationdFinishLaunching)),但如果您实现
+applicationdFinishLaunching
(带有选择器@selector(applicationdFinishLaunching)的类方法)并将类本身设置为应用程序的委托(
[[NSApplication sharedApplication]setDelegate:[CoolClass]]
),应用程序对象将向CoolClass本身发送消息。在Swift Xcode 10.1中,我在(我的)CoolClass.init()中添加了行NSApplication.shared.delegate=self,这在大型项目中很难实现。将50个旧的工作文件推到新项目中是一件费力的事。也许是我,但。。。
#import <Cocoa/Cocoa.h>

@interface CoolClass : NSObject <NSApplicationDelegate> {

}
- (void) applicationDidFinishLaunching : (NSNotification *) aNotification;
@end
#import "CoolClass.h"

@implementation CoolClass
- (void) applicationDidFinishLaunching : (NSNotification *) aNotification {
    NSLog(@"THIS SHOULD BE PRINTED TO THE DEBUG CONSOLE");
}

@end
CoolClass *c = [[CoolClass alloc] init];
[[NSApplication sharedApplication] setDelegate:c];