0

我正在尝试从纯 C++ 发布 UserNotification。我的代码基于这个 SO 答案:https ://stackoverflow.com/a/14083212/5548305

现在我无法为对象属性设置值。我确信我缺少一些东西。我试图利用setValue:forKey,但我找不到任何文档。我搜索了 objc-runtime.h 和 obj.h,但找不到任何让我跳出来的东西。有没有人在这方面尝试过/成功过?

#include <CoreFoundation/CoreFoundation.h>
#include <objc/objc.h>
#include <objc/objc-runtime.h>
#include <iostream>    

int main(int argc, char** argv)
{    

    id app = NULL;


    id notif = (id)objc_getClass("NSUserNotification");
    notif = objc_msgSend(notif, sel_registerName("alloc"));
    notif = objc_msgSend(notif, sel_registerName("init"));
    notif = sel_setValue(CFSTR("title"), id("title"));      <-This line here


    objc_msgSend(pool, sel_registerName("release"));
    return 0;
}
4

2 回答 2

1

该代码是否真正编译?Apple 的 Objective-C 运行时文档近年来变得更糟,但我不记得也找不到任何提及sel_setValue.

-setValue:forKey:就像其他任何消息一样,只是一条常规消息,所以我希望得到更多类似的消息:

objc_msgSend(notif, sel_registerName("setValue:forKey:"), 
             CFSTR("title"), CFSTR("title"))

因为它objc_msgSend采用可变数量的参数,前两个是目标对象和选择器,其余的是方法的各种其他参数。目标键名作为字符串提供,它们在内部映射到属性,尝试了几种不同的组合,在这种情况下,属性也希望保存一个字符串。

声明的返回类型setValue:forKey:void所以没有返回值要捕获。

于 2017-12-11T21:14:20.727 回答
0

如果将来有人试图实现这一点,我确实最终让它工作并在 github 上创建了一个项目,展示了如何在纯 C 中发布 NSUserNotification。

https://github.com/jslegendre/NS-C-UserNotification

于 2018-02-12T00:29:22.230 回答