登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> CLQ工作室开源代码 >> 主题: ⭐[golang/macos/appkit]重磅!在 ai 帮助下解决了 macos app 的两个大问题 [命令行类型程序有编辑器不能输入文字][main函数操作 ui]     [回主站]     [分站链接]
标题
⭐[golang/macos/appkit]重磅!在 ai 帮助下解决了 macos app 的两个大问题 [命令行类型程序有编辑器不能输入文字][main函数操作 ui]
clq
浏览(32) + 2024-11-16 12:11:41 发表 编辑

关键字:

[2024-11-16 14:10:50 最后更新]
⭐[golang/macos/appkit]重磅!在 ai 帮助下解决了 macos app 的两个大问题 [命令行类型程序有编辑器不能输入文字][main函数操作 ui]

其中第二个程序还未证实。

先说输入的问题,在 macos 下用过 govcl 的网友应该都知道,这时候的 govcl 有个顽疾,那就是不打包是无法输入文字的。govcl 的作者也说了这个问题。

我空闲时尝试解决过这个问题,我一直以前是 govcl 的问题,但自己用纯 xcode 实现的 object 代码居然也有这个问题!
多年来我一直以为 macos 下的命令行程序就是这个样子的,心里对苹果也是鄙视,觉得怎么做个 ui 做成这样。

but! 今天装上个新 ai 后不抱希望的问它,因为 ai 经常瞎扯我也不太相信。只不过反正无事,尝试了一一下居然成功了!

关键代码其实只有两行

//--------------------------------------------------------
//2024 ai 说还要有这个

[app activateIgnoringOtherApps:YES]; // 重要!
// 确保应用被激活并获得焦点
// 这样用户才能直接输入文字

//--------------------------------------------------------

////[app run];

确切说只有一行,在 [app run] 之前调用 [app activateIgnoringOtherApps:YES] 就可以了。
//修正,还要有 [app setActivationPolicy:NSApplicationActivationPolicyRegular]; //重要!
//这行代码设置应用为普通 GUI 应用
//如果不设置,应用可能会以后台方式运行

其实我之前查询到过这样的代码,只不过当时得到的是

//[NSApp activateIgnoringOtherApps:YES]; //效果很奇怪

错误点就在于这个是全局静态,而实际上应该用 app 的实例来调用。一点点小 bug 导致我这一两年来出的代码一直是有这个问题的 ...

--------------------------------------------------------
另外一个问题比较隐藏,就是命令行的 main 函数无论是纯 c 还是 golang 都不等于 macos 的 main ui 线程,这里面操作 ui 控件理论上是错误的!!!
但我一直这样写也没问题,直到某些带滚动视力的编辑框在设置内容时一直出错 ... 10 次启动崩溃 78 次,虽然不影响我最后的打包程序,但在独立调试时非常头痛。

ui 的回答是这样的。

--------------------------------------------------------
那在 ui 主线程之外那个创建 windows 的代码是不是也不对

确实如此!为了保持一致性和正确性,窗口的创建也应该放在主线程中。这是一个更正确的版本:


int main(int argc, const char * argv[]) {
@autoreleasepool {
// 1. 初始化应用程序
NSApplication *app = [NSApplication sharedApplication];
[app setActivationPolicy:NSApplicationActivationPolicyRegular];

// 2. 所有 UI 相关操作都放在主线程中
dispatch_async(dispatch_get_main_queue(), ^{
// 创建窗口
NSWindow* window = [[NSWindow alloc]
initWithContentRect:NSMakeRect(0, 0, 800, 600)
styleMask:NSWindowStyleMaskTitled | NSWindowStyleMaskClosable |
NSWindowStyleMaskMiniaturizable | NSWindowStyleMaskResizable
backing:NSBackingStoreBuffered
defer:NO];

// 配置窗口
[window setTitle:@"Command Line GUI"];
[window center];

// 创建控件
NSTextField *textField = [[NSTextField alloc]
initWithFrame:NSMakeRect(20, 540, 200, 24)];
[textField setStringValue:@"Initial Text"];
[textField setEditable:YES];
[window.contentView addSubview:textField];

// 显示窗口
[window makeKeyAndOrderFront:nil];
[app activateIgnoringOtherApps:YES];
});

// 3. 启动主循环
[app run];
}
return 0;
}

主要更正:
窗口创建移到了 dispatch_async 块内
所有 UI 相关的代码都在同一个主线程上下文中
保持了线程安全性和一致性
这样的代码结构更加正确和安全,避免了潜在的线程相关问题。


--------------------------------------------------------
另外还有个小问题。
在 macOS/AppKit 中,scrollView.documentView 和 scrollView.contentView.documentView 实际上指向同一个对象,但通过不同的路径访问:
scrollView.documentView 是一个便捷属性,它实际上是 scrollView.contentView.documentView 的代理(proxy)。当你设置 scrollView.documentView 时,NSScrollView 内部会自动将文档视图设置给它的 contentView。
2. scrollView.contentView 是 NSScrollView 的一个 NSClipView 实例,它负责裁剪和显示文档视图的可见部分。contentView.documentView 是实际的文档内容视图。
结构关系:
)
两种访问方式是等价的,但通常推荐使用 scrollView.documentView,因为:
代码更简洁
这是 Apple 推荐的 API
它封装了内部实现细节
如果你需要直接操作 clipView(比如设置其特定属性),那么才需要通过 scrollView.contentView 来访问。

--------------------------------------------------------
参考
https://www.jianshu.com/p/42a96c8fa94f

为什么手动创建的NSApp没有图标,接收不到键盘响应?

为什么我手动创建的NSApp没有图标,接收不到键盘相应?
那是因为没有设置ActivationPolicy(显示策略)

[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
ActivationPolicy(应用显示策略)

一共有三种应用显示策略
1、NSApplicationActivationPolicyRegular 正规的

这种方式在使用 Info.plist 捆绑开发(bundled apps) 时是默认的选项。
效果: 任务栏(Dock) 上会显示应用的图标,菜单栏(menu bar)上会显示菜单等等所有正常操作。
可以被激活(接受键盘相应、接受鼠标相应)
PolicyRegular 正常模式
2、NSApplicationActivationPolicyAccessory 辅助的

没有任务栏(Dock)上的图标,没有菜单栏(menu bar)
可以被激活(接受键盘相应、接受鼠标相应)
在Info.plist中通过 LSUIElement=1 设置成该显示策略
PolicyAccessory 任务栏中的图标没了

3、NSApplicationActivationPolicyProhibited 禁止的

这种方式在 "生肉"开发(unbundled apps) 时是默认的选项。
没有任务栏(Dock)上的图标,没有菜单栏(menu bar),可能没有窗口(Window),有窗口该窗口也不会被激活。
不可以被激活(不接受键盘相应、接受鼠标相应)
PolicyProhibited 任务栏中的图标没了






























总数:0 页次:1/0 首页 尾页  
总数:0 页次:1/0 首页 尾页  


所在合集/目录
golang 更多
appkit 更多
macos 更多



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1