Objective-C ++ /可可尝试创建带有按钮的窗口,不起作用吗?

| 我应该使用由Objective-C构成并使用可可的c ++方法创建一个c ++类,但是现在我遇到了一个问题,根本无法弄清楚,因为我我在Objective-C上很新。还有一点是,我应该能够从c ++创建窗口和按钮。因此,无论何时我构建并运行该程序,它都会启动,但随后立即变成“无响应”状态。无论如何,这就是我得到的: 窗口
#ifndef WINDOW_H
#define WINDOW_H

class Window {
    public:
        Window();
        void createButton();
};

#endif
窗口mm
#include \"Window.h\"
#include \"Button.h\"

Window::Window(){
    NSWindow *window = [[NSWindow alloc]
        initWithContentRect: NSMakeRect(100, 100, 200, 200)
        styleMask: NSTitledWindowMask | NSMiniaturizableWindowMask
        backing: NSBackingStoreBuffered
        defer: NO];
    [window setTitle: @\"Test window\"];
}

void Window::createButton(){
    Button *button;
    [[this contentView] addSubView: button];
// word this gives warning: no \'-addSubView:\' method found
// this is probably causing the problem I have
    }
按钮
class Button{
    Button();
};
// There will be more methods here eventually
纽扣
#include \"Button.h\"
Button::Button(){
    NSButton *button = [[NSButton alloc]
        initWithFrame: NSMakeRect(14, 100, 120, 40)];
    [button setTitle: @\"Hello world\"];
    [button setAction: @selector(invisible)];
    [button setBezelStyle: NSRoundedBezelStyle];
    [button setButtonType: NSMomentaryLightButton];
    [button setBezelStyle: NSTexturedSquareBezelStyle];
}
Main.cpp
#include \"Window.h\"
#include \"Button.h\"

int main(int argc, char *argv[]){
    Window x;
    x.createButton();
}
所以,有谁知道它为什么不起作用,就像我提到的那样,我在Cocoa和Objective-C还是很新的,还在学习:P 是的,我已经尝试修复它。     
已邀请:
        
[[this contentView] addSubView: button];
您怀疑,这是造成您的问题的原因。 \“ This \”不是指窗口;它指的是类本身。 (请记住,您的类不是NSWindow的子类) 一种选择是在标头中声明您的NSWindow,以便可以全局使用它。因此,使您的标题:
#ifndef WINDOW_H
#define WINDOW_H

class Window {
    public:
        Window();
        void createButton();
        NSWindow *window;
};

#endif
然后将上述行更改为:
[[window contentView] addSubview: button];
(另请注意将大写字母固定在\'addSubview \'上) 您的按钮构造函数也存在类似的问题。您正在创建一个NSButton,但是再也看不到该按钮了。     
        您的“ 8”功能未运行运行循环,因此绘图和事件处理系统将无响应。 您永远不会显示您创建的窗口。 我看不到将Cocoa对象保存到何处,以便您的C ++ API可以操纵它们。例如,您的ѭ9does构造函数不会将创建的窗口保存到成员变量,因此在创建该窗口后将无法对其进行操作。     

要回复问题请先登录注册