我正在尝试通过电子邮件标记我从用户收到的崩溃日志.
我在Xcode.app中使用了传统的symbolicatecrash命令,但symbolicatecrash命令失败并返回以下消息.
$/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash MY_APP.crash MY_APP.app.dSYM > readable.crash
Unsupported crash log version: 12 at /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash line 614.
Run Code Online (Sandbox Code Playgroud)
正如它所说,我想表示的崩溃日志的报告版本是12.
Date/Time: 2016-10-15 15:40:42.625 +0900
OS Version: Mac OS X 10.12 (16A323)
Report Version: 12
Run Code Online (Sandbox Code Playgroud)
我的应用程序是macOS(以前的OS X,不适用于iOS)的纯Cocoa应用程序,它是在macOS Sierra上使用Xcode 8.0构建的,在Mac App Store上分发并用Swift编写.
同时,Xcode 8.0的组织者成功地表示通过MAS接收的相同应用程序版本的崩溃日志.所以我想,dSYM文件至少是正确的.但是出了点问题.
有谁知道我如何象征纯文本崩溃日志,其报告版本是12?
在OS X 10.11 El Capitan上,NSTableView的默认标题高度已经增长.
当我在OS X El Capitan 10.11(GM)和Xcode 7.0(稳定版)上构建我的NSTableView时,即使在之前的操作系统版本上,表头高度也会被El Capitan的标题高度修复,因此上面有一个奇怪的不需要的空间表格标题(请参阅下面的屏幕截图.)
图1 El Capitan上的表头(正确)
图2 Yosemite上的表头(不正确)
这当然是不可取的.
我怎么能避免这个?是否有人面临同样的问题?我甚至找不到任何提到这件事的文章.
我使用捆绑到Xcode 7.0并启用了自动布局的普通Interface Builder来放置我的NSTableView.
我刚刚确认此问题已在Xcode 7.2 + OS X 10.11.2上修复.现在,您可以轻松修改Interface Builder上的NSTableView.
我现在正在尝试使用Objective-C编写的命令行应用程序.
当应用程序没有沙盒时,我可以获取用户使用该应用程序调用该应用程序的目录[[NSFileManager defaultManager] currentDirectoryPath].但是,在沙盒之后,/Users/{MY_ACCOUNT}/Library/Containers/{BUNDLE_IDENTIFIER}/Data无论从何处调用命令行应用程序,应用程序始终返回当前目录.
实际上,我想知道用户作为命令参数传递的文件的绝对路径.
因此,例如,当我调用我的命令行应用程序时:
$ pwd
/Users/MY_ACCOUNT/Desktop
$ ./foo/my_executable subfolder/myfile.txt
Run Code Online (Sandbox Code Playgroud)
以下部分:
NSURL *url = [NSURL fileURLWithFileSystemRepresentation:argv[1] isDirectory:NO relativeToURL:nil];
printf("path: %s\n", [[url absoluteURL] fileSystemRepresentation]);
Run Code Online (Sandbox Code Playgroud)
正确返回非沙盒应用程序:
path: /Users/MY_ACCOUNT/Desktop/subfolder/myfile.txt
Run Code Online (Sandbox Code Playgroud)
但在Sandboxed应用程序上:
path: /Users/MY_ACCOUNT/Library/Containers/BUNDLE_IDENTIFIER/Data/subfolder/myfile.txt
Run Code Online (Sandbox Code Playgroud)
这当然是不正确的.
有没有其他方法可以在Sandboxed命令行应用程序中获取传递的文件路径参数的正确完整路径?或者它是不可能的,我只是放弃沙盒我的应用程序更好?
最后,我自己找到了一个解决方案.
该environment属性[NSProcessInfo processInfo]具有正确的当前用户工作目录,即使该应用程序是沙盒.
NSDictionary *env = [[NSProcessInfo processInfo] environment];
NSString *currentPath = env[@"PWD"];
Run Code Online (Sandbox Code Playgroud)
至少,当我在Terminal.app中调用该命令时,它可以工作.我不确定这是否PWD总是存在.
此外,As @ daij-djan在下面指出,我们甚至没有给定参数的读取权限.但是,无论如何,这个问题的问题一旦得到解决.
(如果有人知道如何读取作为参数传递路径的文件的方式,请告诉我作为答案!)
关于基于文档的 Cocoa 应用程序,Apple 建议覆盖 NSDocumentinit(contentsOf:ofType:)来自定义内容,因此似乎是一个覆盖的好地方。
您可以覆盖此方法以自定义重新打开自动保存的文档。
然而在 Swift 上,这实际上是不可能的,因为 superinit(contentsOf:ofType:)不能被调用,init(contentsOf:ofType:)因为这个初始化器是方便的初始化器之一。
convenience init(contentsOf url: URL, ofType typeName: String) throws {
try super.init(contentsOf: url, ofType: typeName) // <- this marked as error
}
Run Code Online (Sandbox Code Playgroud)
当我在Objective-C中编写基于文档的应用程序时,我使用这种方法,即initWithContentsOfURL:ofType:error:只为使用现有文件打开的文档准备一些文件相关的属性,而不为新的空白文档或恢复的文档准备一些文件相关的属性。
它不能简单地用 NSDocument 代替,read(from:ofType)因为它不仅会在文档打开时被调用,而且在每次重新加载文档时都会被调用(例如 Revert)。
也不可能在 normal 上做我的事情init(),因为fileURL当时还没有设置属性。
init() {
super.init()
self.fileURL // <- returns nil
}
Run Code Online (Sandbox Code Playgroud)
我知道一个方便的初始化程序必须调用一个指定的初始化程序,但是init(contentsOf:ofType:)与init(type:). (如何在 Swift 中初始化一个新的 NSDocument …
最近的 Apple 产品的键盘上有 Globe (\xef\xb8\x8e) 键。在 AppKit 级别,它实际上只是一个 Fn 键,其行为与NSEvent.ModifierFlags.function. 但是有什么方法可以知道用户当前使用的键盘是有 Globe 键还是只有 Fn 键呢?
似乎系统以某种方式知道它,因为菜单中的快捷键显示根据键盘而变化。仅当键盘实际有 Globe 键时才会显示 Globe 符号。否则,显示“fn”。
\n\n但是,到目前为止,我还没有找到一种在 AppKit/SwiftUI 世界中以编程方式检测它的方法。我想在我自己的视图中实现显示这些菜单命令的键盘快捷键。
\n在AppKit上,菜单项和工具栏项分别具有validateMenuItem(_:)和validateToolbarItem(_:).但是,通过新的触摸条项目,没有这种方便的方法来在适当的时刻验证适当的项目.
我现在每次更改相关值并调用验证方法时都会验证触摸条项didSet(请参阅下面的示例代码).但我觉得这不是一个好方法,因为相关的值必须知道有一个触摸栏项目取决于它.
var foo: Foo? {
didSet {
if #available(macOS 10.12.1, *), NSClassFromString("NSTouchBar") != nil {
self.validateTouchBarItem(identifier: .foo)
}
}
}
@available(macOS 10.12.1, *)
func validateTouchBarItem(identifier: NSTouchBarItemIdentifier) {
guard
let item = self.touchBar?.item(forIdentifier: identifier),
let button = item.view as? NSButton
else { return }
switch identifier {
case NSTouchBarItemIdentifier.foo:
button.isEnabled = (self.foo != nil)
default: break
}
}
Run Code Online (Sandbox Code Playgroud)
我使用的另一种方式是Cocoa绑定和KVO,但是,它并不总是很好用.
所以,我很好奇是否有任何推荐或事实标准的方式来验证触摸条项目,特别是包含NSButton和NSSegmentedControl.我不仅要改变物品的可用性,还要根据情况改变它们的图像或颜色.你们如何验证触控条项目?
我想在用户输入字符串中使用反斜杠来使用它们进行正则表达式替换.
逃脱反斜杠很容易完成 NSRegularExpression.escapedTemplate(for: "\\n").这"\\\\n"将按预期返回.但是,如何将它们向后变换,例如,像\\n(反斜杠+ n)到\n(返回)?
是否有任何API来检查正在运行的机器是否有触摸条(或Xcode的触摸条模拟器)?
我有一些方法只有在存在触摸条时才会被调用.如果我只是检查touchBar响应者的属性的可空性,即使机器不支持它,它也会自动创建一个touchBar实例.但是,当它没有意义时,我不想创造一个.
cocoa ×7
swift ×4
appkit ×3
macos ×2
nstouchbar ×2
macos-sierra ×1
nsdocument ×1
nstableview ×1
objective-c ×1
string ×1
swiftui ×1
xcode ×1