标签: appkit

"初始位置"在Xcode的nib编辑器中做了什么?

编辑我的nib用于基于文档的Cocoa应用程序,我看到当我选择了一个窗口或面板时,Xcode让我设置它的"初始位置":

笔尖中的窗口,已选中以及

这与窗口的框架分开,它在它上面,那么这是什么?

什么使用"初始位置",两个弹出菜单及其可能的值是什么意思?

当我运行我的应用程序并且我的文档为这个笔尖创建NSWindowController(两个中的第二个)时,窗口显示为从主文档窗口级联,而不是在初始位置.这是因为我的应用程序是基于文档的(即,"初始位置"将由不属于文档的窗口使用),还是有其他原因?

xcode cocoa appkit nswindow xcode4

7
推荐指数
1
解决办法
2564
查看次数

将图像绑定到NSArrayController的NSPopupbutton

这个问题是链接的扩展(链接中
的问题主要是目标,将NSPopupbutton绑定到NSArrayController)

我有一个Person有类属性NSString *nameNSImage *avatar
我都必须表现弹出按钮人员的所有名称作为下面的图片中看到的. 在此输入图像描述

但是现在,随着要求的变化,我也需要展示人的化身.
如何使用Cocoa绑定将人的头像绑定到NSPopup按钮,使其看起来像上面图像中的michael(最后一个菜单选项)


注意:Michael已使用以下代码暂时添加进行演示:

person.title = @"Michael";
person.image = [NSImage imageNamed:@"avatar.png"];
[_popupButton.menu addItem:person];
Run Code Online (Sandbox Code Playgroud)

macos cocoa objective-c appkit cocoa-bindings

7
推荐指数
1
解决办法
902
查看次数

自上而下滑块

我在OSX 10.10上使用XCode 6.1.1

我有一个以下的可可窗口

可可窗口

我无法仅使用IB制作垂直自上而下的滑块.(B视图中的第二个滑块)
如示例中所示

  • 对于水平滑块,当我将另一个滑块的布局设置为"从右到左"时,它可以正常工作.(如A视图中所示)
  • 但是对于垂直滑块,当我将其设置为"从右到左"滑块时,它不会以其他方式工作.(如B视图中所示).
  • 我也试过使用setFrameCenterRotation,它解决了目的,但自动分析搞砸了.(如图C所示)

    这似乎是一个XCode错误.


那么如何仅使用IB制作自上而下的滑块呢?

macos cocoa appkit

7
推荐指数
1
解决办法
234
查看次数

如何解决“type_info 具有隐藏可见性。它们都应该具有公共可见性。”?

在 macOS 系统控制台上,启动我的应用程序之一时会记录此错误:

APP[28193]:dynamic_cast 错误 2:以下一个或多个 type_info 具有隐藏可见性。他们都应该具有公众知名度。17CPP 类名,28CPP 类名B。

据我所知,它还没有影响功能,但显然有些问题。检查Clang源中此警告的来源也表明它会对性能产生影响。

这是为一个框架生成的,其中包括我的应用程序中引用它的其他框架使用的 C++ 类。

FWIW,该警告是由Clangprivate_typeinfo.cpp中的类引起的(https://github.com/llvm-mirror/libcxxabi/blob/master/src/private_typeinfo.cpp)。

根据Apple 的C++ 运行时环境编程指南中的“控制符号可见性”一章,我应该能够使用属性或 GCC 编译指示在类级别上控制可见性。

事情是,据我所知,符号已经可见,nm并且我的框架都已经具有Default可见性(即NOT Hidden)。

另外,使用(属性或编译指示)强制默认可见性会导致应用程序在之前仅创建警告的地方崩溃。

奇怪的是,此警告仅针对某些类生成,而同一编译单元/框架中的大多数其他类不会引起任何警告。

任何有关如何解决此问题的进一步提示或想法都非常感谢!

c++ macos xcode appkit clang++

7
推荐指数
1
解决办法
6550
查看次数

在 SwiftUI 中使用 NSTableView?

有没有人NSTableView开始使用 SwiftUI?每当我运行我的代码时,我的应用程序都不会加载,但也没有错误。没有表视图的任何示例,但我认为它会使用NSViewControllerRepresentable. 我不完全确定您如何设计表格并将其添加到视图中。感谢您的帮助!

struct SampleViewController: NSViewControllerRepresentable {
    
    var tableView:NSTableView = {
        let table = NSTableView(frame: .zero)
        table.rowSizeStyle = .large
        table.backgroundColor = .clear
        return table
    }()
    
    func makeNSViewController(context: Context) -> NSViewController {
        
        return NSViewController()
    }
    
    func updateNSViewController(_ nsViewController: NSViewController, context: Context) {
        //tbd
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
    
    class Coordinator: NSObject, NSTableViewDataSource, NSTableViewDelegate {
        var parent: SampleViewController
        
        init(_ tvController: SampleViewController) {
            self.parent = tvController
        }
        
        func numberOfRows(in tableView: NSTableView) -> Int {
            return 10 …
Run Code Online (Sandbox Code Playgroud)

appkit swift swiftui

7
推荐指数
1
解决办法
1879
查看次数

在 macOS 上的 SwiftUI NavigationView 中切换侧边栏

我有一个带有 a 的 macOS 应用程序,NavigationView并希望在窗口的工具栏中拥有默认的 ToggleSidebar 项。

目前我将 ToolbarItem 的目标设置toolbarWillAddItem(_)NSToolbarDelegate.

在我实现的 AppDelegate 内部

@objc func toggleSidebar(_ sender: Any) {
    ((window.contentView?.subviews.first?.subviews.first?.subviews.first as? NSSplitView)?.delegate as? NSSplitViewController)?.toggleSidebar(self)
}
Run Code Online (Sandbox Code Playgroud)

此解决方案现在正在运行。如果 SwiftUI 的实现将改变这一点。

那么如何才能以更好的方式做到这一点呢?

macos appkit swift swiftui

7
推荐指数
3
解决办法
3059
查看次数

SwiftUI:检测 Mac 触控板上的手指位置

我正在为 macOS 制作一个 SwiftUI 应用程序,我想通过检测用户手指的位置将触控板用作 (x, y) 输入。我想能够检测到的多个手指在触控板上(不拖移)。我怎么做?

以前有人问过类似的问题,但我再次问,因为那是近 10 年前的问题,答案都在 Obj-C 中(Swift 3 中的一个),我想知道是否有更新的方法。最重要的是,我不知道如何将 Obj-C 代码实现到我的 SwiftUI 应用程序中,所以如果没有任何更新的方法,如果有人能解释如何实现旧的 Obj-C 代码,我将不胜感激。

为了说明我的意思,AudioSwift 应用程序的这个视频演示正是我想要的。macOS 本身也用这个来手写中文(虽然我不需要识别字符)。

macos cocoa appkit swift swiftui

7
推荐指数
1
解决办法
625
查看次数

通过命令行将文件 URL 和 args 发送到(正在运行的)macOS 应用程序

我一直在尝试创建一种方法来告诉我的(正在运行的)macOS 应用程序打开一些文件并为命令提供一些额外的参数。

对于冷启动应用程序,使用

$ open MyApp.app fileA.txt --args --foo-arg
Run Code Online (Sandbox Code Playgroud)

将启动应用程序,我将能够检查--foo-arg通过UserDefaults/ CommandLine/ ProcessInfo。但是,如果应用程序已经在运行,--foo-argUserDefaults/ ProcessInfo?/ 中缺少CommandLine

我一直在努力解决这里的解决方案,因为我有一些要求使事情变得更加困难。

要求

  1. 发送到应用程序的文件路径必须使用沙箱权限打开/保存
  2. 参数和文件路径必须同时被app拦截。

潜在的解决方案

XPC

有些人建议我使用 XPC,但在阅读它之后,我不确定该解决方案的外观如何?

  • 我是否必须创建一个始终运行的 Launch Agent 应用程序伴侣,以便它可以检测命令行操作并将其传递给我的应用程序?
  • 这如何与沙箱一起使用,因为每个进程都有自己的权限?

苹果脚本

  • 我是否应该使用 Apple 脚本告诉我的应用程序使用参数打开这些文件,从而绕过沙箱功能?
  • 通过 AppleScript 打开文件时,我可以保存这些文件吗?

网址方案

我可以注册我的应用程序以拥有自己的 URL 方案,但 NSApplicationDelegate 处理传入 URL 的方式分为两批。首先是它可以打开的 URL,然后是它无法打开的 URL 方案或文件路径。IE:

open -a MyApp.app myapp:foo; open -a MyApp.app file.txt
Run Code Online (Sandbox Code Playgroud)

我可能可以完成这项工作,但它有点俗气,我真的很想以正确的方式做到这一点。

macos cocoa applescript xpc appkit

7
推荐指数
1
解决办法
492
查看次数

侧栏中的 Big Sur 工具栏项目

在 Big Sur 中,Xcode 和 Calendar 的工具栏项目在打开时保留在侧边栏上,但在侧边栏折叠时在左侧仍然可见。

侧边栏打开: 在此处输入图片说明

侧边栏折叠: 在此处输入图片说明

在13:55 的“采用 macOS 的新外观”中,John 说“放置在分隔符 [sidebarTrackingSeparator] 之前的项目将出现在全高侧边栏上”,就像它们在 Xcode 和日历中一样。我一直无法完成这项工作。

这是一个演示该问题的示例项目。我使用了 IB 定义的“带有侧边栏的窗口控制器”,并添加了一个用于切换侧边栏的工具栏项。在 NSWindowController 的子类中,我.sidebarTrackingSeparator.toggleSidebar项目后插入:

override func windowDidLoad() {
    // Sometimes the toolbar items aren't loaded yet--async is a quick and dirty way to prevent a crash
    DispatchQueue.main.async {
        self.window?.toolbar?.insertItem(withItemIdentifier: .sidebarTrackingSeparator, at: 1)
    }
}

Run Code Online (Sandbox Code Playgroud)

有时这不起作用(切换按钮保留在侧边栏的右侧)。有时侧边栏切换会放在溢出菜单中:

在此处输入图片说明

在 WWDC 会议之外,我还没有看到任何关于实现此工具栏设计的讨论。有没有人能够让这个工作?

macos appkit nstoolbar nstoolbaritem macos-big-sur

7
推荐指数
1
解决办法
2176
查看次数

处理换行符的 shift+enter,在 TextEditor SwiftUI 中输入发送

我正在尝试在文本框中处理换行符的shift+enter(聊天应用程序例如WhatsApp、Discord 等实现)。目前,我正在使用 SwiftUI TextEditor,但它没有任何方法可以像在 AppKit 中那样处理原始键盘事件。因此,一个黑客解决方案是检查消息的最后一个字符是否是 .onchange 中的换行符,然后发送消息。这种方法适用于“输入发送”,但我找不到在按下 Shift 键时不发送消息的方法(对于多行消息)。

我正在尝试一种使用NSViewRepresentableAppKit API 的方法,如下所示:

struct KeyEventHandling: NSViewRepresentable {
    class KeyView: NSView {
        override var acceptsFirstResponder: Bool { true }
        
        override func keyDown(with event: NSEvent) {
            print("keydown event")
        }

        override func flagsChanged(with event: NSEvent) {
            switch event.modifierFlags.intersection(.deviceIndependentFlagsMask) {
            case [.shift]:
                print("shift key pressed")
            default:
                print("no modifier keys are pressed")
            }
        }
    }

    func makeNSView(context: Context) -> NSView {
        let view = KeyView()
        DispatchQueue.main.async { // wait till next event …
Run Code Online (Sandbox Code Playgroud)

macos appkit swiftui

7
推荐指数
1
解决办法
1425
查看次数