小编Mar*_*ark的帖子

给定窗口ID,确定窗口所在的屏幕

NSScreen假设我有窗口ID,有没有办法获得另一个进程的窗口?

我与以下代码非常接近,但信息字典没有说明窗口在哪个屏幕上.

CFArrayRef windowArray = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
NSArray*  windowList = (NSArray*)CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
NSUInteger count = [windowList count];
for (NSUInteger i = 0; i < count; i++)
{
    NSDictionary*   nswindowsdescription = [windowList objectAtIndex:i];
    NSNumber* windowid = (NSNumber*)[nswindowsdescription objectForKey:@"kCGWindowNumber"];
    if(windowid)
    {
        if ([windowid integerValue] == appWeAreLookingForWindowId)
        {
            Warning(@"Found it: %@", nswindowsdescription);
        }
    }
}
CFRelease(windowArray);
Run Code Online (Sandbox Code Playgroud)

来自:CGWindowListCopyWindowInfo,kCGWindowLayer和窗口级别

这里输出:

kCGWindowAlpha = 1;
kCGWindowBounds =     {
    Height = 1010;
    Width = 1600;
    X = 284;
    Y = 43;
};
kCGWindowIsOnscreen = 1; // …
Run Code Online (Sandbox Code Playgroud)

cocoa nswindow

6
推荐指数
1
解决办法
1149
查看次数

mouseDown:在NSTableView内的自定义NSTextField中

我有一个基于视图的NSTableView.表中的每个视图都有一个自定义文本字段.

当用户点击表格视图中的文本字段(标签)时,我想触发一个动作(想象一下,在每个表格单元格中都有一个带有自定义动作的超链接).

我已经创建了一个基本NSTextField子类来捕获鼠标事件.但是,它们仅在第二次单击时触发,而不是第一次单击.

我尝试使用一个,NSButton并立即开火.

这是自定义标签的代码:

@implementation HyperlinkTextField

- (void)mouseDown:(NSEvent *)theEvent {
    NSLog(@"link mouse down");
}

- (void)mouseUp:(NSEvent *)theEvent {
    NSLog(@"link mouse up");
}

- (BOOL)acceptsFirstResponder {
    return YES;
}

- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent {
    return YES;
}
@end
Run Code Online (Sandbox Code Playgroud)

cocoa nstextfield nstableview

6
推荐指数
2
解决办法
5394
查看次数

应用内购买有时会因SKErrorDomain Code = 0"Unknown Error"而失败.在生产中

我有一个Mac应用程序,提供应用程序内购买.有一段时间我有用户联系我,因为购买失败并出现以下错误.

请注意,这适用于普通用户.这对我来说可以.(对于具有"测试"用户帐户的开发人员来说,这有很多问题,这不是这种情况).

错误:

Error Domain=SKErrorDomain Code=0 "Unknown Error." UserInfo=0x7fead1e44490 
{NSLocalizedDescription=Unknown Error.} 
Run Code Online (Sandbox Code Playgroud)

macos storekit in-app-purchase mac-app-store

6
推荐指数
1
解决办法
432
查看次数

应用程序暂停时访问UI线程?

我有一个UWP应用程序,允许用户创建和修改文本文档.我很难让保存机制与app suspend/resume生命周期一起工作.

这是我有的:

  1. 所有磁盘访问都在单独的后台线程上完成,以保持UI响应
  2. 该后台线程还序列化所有磁盘访问,以确保始终只进行一次读取或写入操作
  3. 保存文档之前和之后,UI将更新以指示正在进行保存.这是在UI线程上安排的Dispatcher.RunAsync()

当应用程序被暂停时:

  • 暂停时,我必须最后一次保存文档以确保所有更改都在磁盘上(应用程序可能会在暂停时终止)
  • 所以我要求一个 ExtendedExecutionSession
  • 我在队列上安排了一个最终的保存操作
  • 然后我等待队列处理所有挂起的磁盘访问操作
  • 最后,我将扩展执行会话标记为已完成

我的问题:

  • 已安排的保存操作完成其磁盘访问,然后尝试通过主线程更新UI Dispatcher.RunAsync().后台队列等待此任务完成,但它永远不会,因为到那时,UI线程已经停止.

→所以我的最终保存操作永远不会执行,因为后台队列等待更新UI.

这是一个流程图:

应用程序暂停流程图

出现的一些问题:

  1. 当应用程序被暂停时,UI线程到底是什么时候停止的?只有当它闲置或"介于两者之间"时?即如果我安排了一个块通过Dispatcher.RunAsync(),这至少会完成或"冻结"吗?
  2. 有没有办法让我检查当前窗口的UI线程是否已经停止,以便我知道我不能再在后台文件访问线程中访问它了?
  3. 当应用程序被暂停时,哪些线程会停止以及何时停止?
  4. 应用程序暂停时,我的后台文件访问线程是否也有被阻止的风险?

总结一下这个问题:

当应用程序被暂停时,我必须确保在等待后台线程上的潜在挂起磁盘访问权限才能完成,然后我再次保存文档,以防我的应用程序稍后终止.

c# multithreading suspend uwp windows-10-universal

6
推荐指数
1
解决办法
377
查看次数

对于 iCloud 中可能尚未下载的文件使用 NSFileManager.fileExists(atPath:) 是否安全?

我需要一种 100% 故障安全的方法来确定文件名/文件 URL 是否可用于将数据写入磁盘,而不会意外删除现有文件。

目前我正在使用NSFileManager.fileExists(atPath:),但我想知道,如果父目录位于 iCloud 中并且我的文件 URL 指向 iCloud 中尚未下载到设备的现有文件怎么办?

让我想到的是这两种方法URL

  • func checkResourceIsReachable() throws -> Bool
  • func checkPromisedItemIsReachable() throws -> Bool

资源和承诺项目之间存在区别。承诺项目定义为:

除非您使用文件协调器对其 URL 执行协调读取(这会导致内容被下载或以其他方式生成),否则无法保证承诺的项目的内容会存在于文件系统中。

背景:

我想要的是一个扩展,FileManager它返回给定(现有)文件 URL 的下一个可用的、不存在的文件名。例如:

  • 假设我现有的文档是:/documents/Text.txt
  • 下一个可用的文件名可能是:/documents/ Text 2 .txt

如何检查Text 2.txt本地和 iCloud 中是否确实不存在?

这是我目前的方法:

// Safer than: FileManager.default.fileExists(at: url) ?
private func fileExists(at url:URL) throws -> Bool
{
    if (try url.resourceValues(forKeys: [.isUbiquitousItemKey])).isUbiquitousItem == true
    {
        return try url.checkPromisedItemIsReachable()
    }
    else
    {
        return try url.checkResourceIsReachable()
    } …
Run Code Online (Sandbox Code Playgroud)

cocoa nsurl nsfilemanager icloud icloud-drive

6
推荐指数
0
解决办法
252
查看次数

泛型类的 Swift 扩展类型约束,其中泛型类型是另一种泛型类型

我正在尝试了解 Swift 中的泛型类型约束。这是我的出发点:

\n\n
class Promise<T> {\n    func resolve(_ block:@escaping (T) ->Void) {}\n    func fulfill(_ result:T) {}\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

Promise 就是将来可以实现的事情。当它与 Swift 类型一起使用时,Result将结果从后台队列返回到主队列时,这会变得非常有用:

\n\n
let promise = Promise<Result<String, Error>>()\npromise.fulfill(.success("Hello"))\npromise.fulfill(.failure(NSError()))\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在我想向所有用于Result添加这些辅助方法的 Promise 实例添加扩展:

\n\n
extension Promise where T == Result<X, Error> {\n                                    \xe2\xac\x86\xef\xb8\x8e Here\'s the problem \xe2\x9a\xa1\xef\xb8\x8f\n    func failure(_ error:Error) {\n        fulfill(.failure(error))\n    }\n\n    func success(_ result:X) {\n        fulfill(.success(result))\n    }\n}\n\n// Shorter:\nlet promise = Promise<Result<String, Error>>()\npromise.success("Hello")\npromise.failure(NSError())\n
Run Code Online (Sandbox Code Playgroud)\n\n

唯一的问题是上面的代码无法编译,因为X没有定义。我想表达的是这样的:

\n\n

Promise当其泛型类型T为 where 类型Result<X,Z>且 …

generics type-constraints swift swift-extensions

6
推荐指数
1
解决办法
1745
查看次数

Mac OS X Hot Corners:运行自定义AppleScript?

有没有办法使用Mac OS X的"Hot Corners"运行自定义AppleScript或任何其他自定义应用程序?

默认系统设置列出了许多操作(例如,Launchpad,Mission Control,桌面等),但没有任何内容可以让我启动自定义应用程序.也许有一种方法可以"重定向"其中一个去做那个?

macos system-preferences

5
推荐指数
0
解决办法
845
查看次数

根据下一行是否为组行绘制自定义NSTableRowView

我有一个自定义NSTableRowView实现来显示我的数据单元格.该表还包含使用简单的组行NSTextField.

在我的自定义行视图中,我需要稍微更改底部分隔符的绘图,具体取决于下面的下一行是数据单元格(即我的自定义行)还是组标题.

在组头的情况下,我不必绘制分隔符,否则我最终会得到一个2px分隔符,如屏幕截图所示.

有没有办法从下一个(或上一个)NSTableRowView实例获取引用[NSTableRowView drawBackgroundInRect:...]

分离器

cocoa nstableview

5
推荐指数
1
解决办法
3589
查看次数

截断多行NSTextField的最后一行

我正在尝试创建一个类似于Finder文件标签的文本字段.我希望最后(第二)行在中间被截断.

我从一个多线开始NSTextField.

但是,[self.cell setLineBreakMode:NSLineBreakByTruncatingMiddle];在文本字段中调用结果只显示一条截断的行(不再有换行符).

这是Finder中的样子:

Finder的例子

cocoa nstextfield nstextfieldcell

5
推荐指数
1
解决办法
4280
查看次数

如何使用Xcode等蓝色色调绘制分段控件?

我正在尝试重新创建Xcode中使用的分段控件,其中图像是用蓝色色调绘制的.

例如在Interface Builder中:

Interface Builder示例

到目前为止,我有一个自定义NSSegmentedCell覆盖- (void)drawSegment:(NSInteger)segment inFrame:(NSRect)frame withView:(NSView *)controlView,但我坚持如何绘制带有灰色色调的段图像(1)和(2)如果选择了蓝色色调.

此外,它看起来像是用边框或渐变效果绘制的.当我自己绘制段图像时,它只是黑色(因为我使用模板图像).

如何从上方重新创建片段?

xcode cocoa nssegmentedcontrol

5
推荐指数
1
解决办法
1587
查看次数