Objective-C开发中如何将NSText控件显示到NSWindow上
实现方法
你不需要依赖NSApplication相关逻辑,NSWindow本身就支持添加子视图,完全可以满足你用NSText、单方法调用的需求。
首先先修正你原有代码的两处编译/运行问题:
- 初始化NSText实例后,你错误地使用了未定义的变量
t赋值文本,应该对应你声明的label变量 - 手写的事件循环没有做事件分发,运行后会占满CPU且界面无响应
你要的单句添加控件的调用可以直接通过NSWindow的contentView实现,contentView是窗口内所有UI元素的根承载视图,原生支持添加子视图,调用写法为:
[window.contentView addSubview:label];
如果你想要完全符合[window 命令: label]的调用形式,不需要写中间的contentView,可以给NSWindow写一个极短的分类方法做转发,代码直接放在main函数前即可:
@interface NSWindow (QuickAdd) - (void)addSubview:(NSView *)view; @end @implementation NSWindow (QuickAdd) - (void)addSubview:(NSView *)view { [self.contentView addSubview:view]; } @end
写完分类后你就可以直接用你预期的形式调用,不需要额外依赖其他类:
[window addSubview:label];
修正后可直接运行的完整代码
#include <Cocoa/Cocoa.h> NSColor *createColor(float r, float g, float b, float a) { return [NSColor colorWithCalibratedRed:r green:g blue:b alpha:a]; } NSRect createRect(float startX, float startY, float width, float height) { return NSMakeRect(startX, startY, width, height); } // NSWindow快速添加子视图分类 @interface NSWindow (QuickAdd) - (void)addSubview:(NSView *)view; @end @implementation NSWindow (QuickAdd) - (void)addSubview:(NSView *)view { [self.contentView addSubview:view]; } @end int main() { @autoreleasepool { NSWindow *window = [[NSWindow alloc] init]; window.title = @"Title"; window.subtitle = @"Subtitle"; NSText *label = [[NSText alloc] initWithFrame: createRect(20, 250, 240, 40)]; label.string = @"test"; label.drawsBackground = NO; // 可选,去掉NSText默认白色背景 label.editable = NO; // 可选,设为不可编辑更符合标签使用场景 [window setFrame:createRect(0, 0, 300, 300) display:YES animate:YES]; [window setBackgroundColor: createColor(0.5, 1, 0.1, 1)]; // 按预期形式添加NSText实例 [window addSubview:label]; [window makeKeyAndOrderFront:nil]; // 修正后的事件循环,避免界面卡死、CPU占满 while (1) { NSEvent *event = [window nextEventMatchingMask:NSEventMaskAny untilDate:[NSDate distantPast] inMode:NSDefaultRunLoopMode dequeue:YES]; if (event) { [window sendEvent:event]; } } } }
注意事项
- 该方案全程使用NSText,不需要替换为NSTextField,符合你的需求
- 原代码里给NSText设置的20*20尺寸过小,默认系统字体下无法完整显示文本,建议按示例调大尺寸
- Cocoa窗口坐标系以左下角为原点,原代码中
(10,10)的位置在窗口最左下角容易被遮挡,调整坐标后可正常显示
内容的提问来源于stack exchange,提问作者user18791650
相关产品推荐
相关产品推荐

