注册显示重新配置回调

Kri*_*ris 4 macos cocoa objective-c callback

我正在整理Mac OS X应用程序,我正在尝试注册接收显示重新配置通知,但我现在很丢失.我一直在阅读Apple的文档和一些论坛帖子等等,但是一切似乎都假设对事物的了解比我显然拥有的要好.我知道我必须在运行循环中请求回调才能正常工作.不过,我不知道如何为它设置一个基本的运行循环.我也觉得Apple在他们的文档中的例子是缺少他们期望我已经知道的东西.在这里展示我的无知是我觉得事情应该是什么样子.

NSRunLoop *rLoop = [NSRunLoop currentRunLoop];
codeToStartRunLoop

 void MyDisplayReconfigurationCallBack (
                                       CGDirectDisplayID display,
                                       CGDisplayChangeSummaryFlags flags,
                                       void *userInfo);
{
    if (flags & kCGDisplayAddFlag) {
        NSLog (@"Display Added");
    }
    else if (kCGDisplayRemoveFlag) {
        NSLog (@"Display Removed");
    }
 }

CGDisplayRegisterReconfigurationCallback(MyDisplayReconfigurationCallBack, NULL);
Run Code Online (Sandbox Code Playgroud)

我得到的实际代码来自Apple的示例,但它告诉我这flags是一个未声明的标识符,并且不会编译.并不是说它能正常工作,因为我没有在运行循环中使用它.我希望找到一个教程,解释在运行循环中注册系统回调但是没有成功.如果有人能指出我正确的方向,我会非常感激.

(我相信你能从我的问题中说出我很绿.我自学了Objective-C作为我的第一门编程语言.我跳过C,所以偶尔我遇到了一些我无法弄清楚的障碍.)

Jos*_*ell 5

如果您正在编写Mac OS X应用程序,AppKit已经为您设置了一个运行循环,因此您无需担心该部分.当你也在创建自己的线程时,你真的只需要在Cocoa中创建自己的运行循环.

对于"未声明的标识符"部分,它看起来像是由于拼写错误/语法错误:

void MyDisplayReconfigurationCallBack (CGDirectDisplayID display, 
                                       CGDisplayChangeSummaryFlags flags,
                                       void *userInfo);
// Semicolon makes this an invalid function definition^^
{
    // This is an anonymous block,* and flags wasn't declared in it
    if (flags & kCGDisplayAddFlag) {
    // etc.
}
Run Code Online (Sandbox Code Playgroud)

此外,与其他语言不同,您不能在其他函数,方法或块*中声明或定义函数 - 它们必须位于文件的顶层.你不能把它放在你打电话的地方CGDisplayRegisterReconfigurationCallback.

就像一个示例(我不知道你的代码的其余部分是什么样子):

// MyClassThatIsInterestedInDisplayConfiguration.m
#import "MyClassThatIsInterestedInDisplayConfiguration.h"

// Define callback function at top level of file
void MyDisplayReconfigurationCallBack (
                                   CGDirectDisplayID display,
                                   CGDisplayChangeSummaryFlags flags,
                                   void *userInfo)
{
    if (flags & kCGDisplayAddFlag) {
        NSLog (@"Display Added");
    }
    else if (kCGDisplayRemoveFlag) {
        NSLog (@"Display Removed");
    }
}

@implementation MyClassThatIsInterestedInDisplayConfiguration

- (void) comeOnBabyAndDoTheRegistrationWithMe {
    // Register callback function inside a method
    CGDisplayRegisterReconfigurationCallback(MyDisplayReconfigurationCallBack, 
                                     NULL);
}

@end
Run Code Online (Sandbox Code Playgroud)

*基本的C卷括号分隔的东西,而不是新酷的Obj-C ad hoc函数的东西.