标签: appkit

您为Mac OSX开发软件的动机是什么?

我真的很喜欢我的Mac,我正在考虑将来的某个时候开发软件.你制作Mac软件的原因是什么?因为你认为Mac太酷了?或者市场如此有趣?我想我们很多人都想知道,对吧?

对我来说,正如我所说,这是Mac的酷.我对市场一无所知.

macos cocoa objective-c appkit

4
推荐指数
2
解决办法
879
查看次数

NSProgressIndicator不在图层支持的视图中设置动画

NSProgressIndicator在层支持视图的子视图中有条形.它的行为有点复杂,但在某些点上,它显示为条形不确定的进度指示器.问题是,在这种状态下,它没有动画(即转动理发杆).关闭图层支持可以解决问题,但这使得其他动画窗口不太顺畅,所以我希望能有更好的东西.

这是完整的行为:当设置了脏标志的数量时,它应该作为不确定的动画进度指示器可见; 然后在短暂的延迟之后(为了确保用户已完成输入),它会转换为确定的进度指示器并在执行各种操作时填充; 最后,在整个过程结束时,它再次隐藏起来.

为实现这一点,我设置了以下绑定:

  • 隐藏绑定到我的模型的loading属性与NSNegateBoolean值变换器.
  • Indeterminate是否绑定到我的模型的waitingForInput属性.
  • 绑定到我的模型的currentProgress属性(当waitingForInput为真时为0 ).
  • Max Value绑定到我的模型的maximumProgress属性(当waitingForInput为true 时为0 ).

这主要工作,但有一个例外:当waitingForInputYES,因而进度指示器是不确定的,进度指示器没有动画.

进度指示器不更新的通常原因是程序员使用长时间运行的操作来阻止运行循环,但我不这样做:在有问题的时间段内,运行循环是完全打开的,只有一个计时器等待开火.据我所知,它也不是一些奇怪的模式.该应用程序在此期间接受击键和其他事件,没有任何问题.(后期阶段,确定的进度指示器填满,由异步驱动NSURLConnection,所以它也不会阻塞.)

我已经采取了几个步骤来尝试解决此问题:

  • 我已经尝试将进度指示器上的Animate绑定设置为我的模型waitingForInput属性,如Is Indeterminate.这会导致动画在更改通知触发时急剧更新waitingForInput(waitingForInput每次输入延迟重新启动时都会发送KVO通知),但我希望动画更平滑.
  • 我一直在使用志愿观察变化都试过loadingwaitingForInput.当观察到变化时,它会根据需要调用进度指示器-startAnimation:-stopAnimation:方法.这些没有明显的效果.
  • 我已经尝试将usesThreadedAnimation进度指示器设置为NO.(Google上的一篇文章表明,这可能有助于更新图层支持的进度指标上的问题.)这没有明显的效果.我也试过YES,只是为了踢,这被证明同样徒劳无功.

最后,我也尝试过关闭图层背衬.当与Animate绑定结合使用时,这确实解决了问题.但是,它会让其他动画的性能降低到令人无法接受的程度,所以我宁愿避免这样做.

那么,任何想法,任何人?我真的很感激这个问题的一些帮助!

macos cocoa core-animation appkit

4
推荐指数
1
解决办法
4124
查看次数

获取NSView和NSImageView的宽度和高度

我有一个NSView,NSView上有一个NSImageView

在NSView的源代码中

我写:

NSImage *image = [[[NSImage alloc] initWithContentsOfURL:url] autorelease];
NSImageView *newImageView = nil;
newImageView = [[NSImageView alloc] initWithFrame:[self bounds]];
[newImageView setImage:image];
[newImageView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
Run Code Online (Sandbox Code Playgroud)

有没有办法读取NSView和NSImageView的宽度和高度?

cocoa nsview appkit

4
推荐指数
1
解决办法
6618
查看次数

nstextfield securetextentry

当我得到用户输入的罚款时,我正在制作一个登录页面。凭据将存储在文件中。存储在文件中的值设置为的字符串NSTextField。如果我使用NSSecureTextField该密码,则从文件中读取值时用户将永远不会看到该密码。我搜索了,但无法在用户界面中查看密码。我想知道是否有任何方法可以使密码在我的帐户中可见NSSecureTextField。我刚刚尝试过,NSTextField但是用户可以看到输入的密码。

macos xcode interface-builder nstextfield appkit

4
推荐指数
1
解决办法
2160
查看次数

在OS X v10.11中不推荐使用NSTextView的insertText方法.什么是替代品?

我在AppKit API Reference中看到该insertText方法在OS X v10.11中已弃用.我应该用什么作为替代品呢?

macos cocoa nstextview appkit

4
推荐指数
1
解决办法
2000
查看次数

在视图外部释放鼠标按钮时,NSView不会收到mouseUp:event

我有一个自定义NSView子类(例如)以下方法:

override func mouseDown(with event: NSEvent) { Swift.print("mouseDown") }
override func mouseDragged(with event: NSEvent) { Swift.print("mouseDragged") }
override func mouseUp(with event: NSEvent) { Swift.print("mouseUp") }
Run Code Online (Sandbox Code Playgroud)

只要按下鼠标(按钮),拖动并释放所有视图内部​​,这都可以正常工作.但是,当在视图内按下鼠标时,移动到视图外,然后才释放,我从未收到过该mouseUp事件.

PS:调用super实现没有帮助.

cocoa event-handling nsview appkit mouseup

4
推荐指数
1
解决办法
1269
查看次数

验证NSTouchBar项目的最佳实用方法

在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.我不仅要改变物品的可用性,还要根据情况改变它们的图像或颜色.你们如何验证触控条项目?

cocoa appkit swift macos-sierra nstouchbar

4
推荐指数
1
解决办法
564
查看次数

如何使用NSSplitViewController设置自定义NSSplitView?

我想使用自定义NSSplitView与我NSSplitViewController

文件说:

要提供自定义的拆分视图,请在继承的viewDidLoad()方法中调用super之前随时设置此属性。也就是说,在拆分视图控制器的isViewLoaded属性为true之前。

我的NSSplitViewController子类称为MainVC

我尝试-viewDidLoad在调用之前设置我的自定义拆分视图[super viewDidLoad]

- (void)viewDidLoad {
    self.splitView = [MySplitView new];
    [super viewDidLoad];
    // Rest of viewDidLoad...
}
Run Code Online (Sandbox Code Playgroud)

但这没用。我收到以下错误:

2017-09-02 10:35:43.527312-0700 Zee [6497:632581] ** *-[MainVC setSplitView:],/ BuildRoot / Library / Caches / com.apple.xbs / Sources / AppKit / AppKit-中的声明失败1561 / Controllers / NSSplitViewController.m:220

2017-09-02 10:35:43.527558-0700 Zee [6497:632581] MainVC:-splitView只能在加载视图之前分配

我也尝试覆盖loadView

- (void)loadView {
    self.splitView = [MySplitView new];
    [super loadView];
}
Run Code Online (Sandbox Code Playgroud)

但是我得到:

2017-09-02 10:39:39.377345-0700 …

macos cocoa appkit nssplitview nssplitviewcontroller

4
推荐指数
1
解决办法
643
查看次数

NSToolbar中的下拉菜单,例如Mail.app

我想要一个带有附加的下拉菜单的工具栏按钮,例如Mail.app工具栏中的“标记”按钮:

来自Mail.app的标志菜单

我希望可以像这样正常制作NSMenuItem并添加菜单menuFormRepresentation,但是该菜单仅在按钮进入溢出模式时才会出现。

我还希望添加一个NSPopupButton作为自定义视图的视图可以起作用,但这会使整个视图成为菜单,而我希望组件的左侧部分像普通按钮一样工作,而右侧的下拉部分可以调出菜单。

是否有一些技巧可以使NSToolbarItem显示这样的组件,或者这两个自定义视图粘在一起?

cocoa appkit nstoolbar nspopupbutton

4
推荐指数
1
解决办法
442
查看次数

如何让 Mac 应用程序响应命令波浪键快捷方式来切换窗口

在大多数 Mac 应用程序中,可以使用cmd ~快捷键在应用程序的打开窗口之间切换。我也想在我的应用程序中使用它,但我真的不知道如何实现。

大多数快捷键都是通过向菜单项之一添加快捷方式来实现的。但是对于这个菜单项不适用。

macos appkit swift

4
推荐指数
1
解决办法
1433
查看次数