我想以编程方式操作macOS中的菜单栏图标,理想情况下支持Swift中的Yosemite,El Capitan和Sierra.我主要想要的是暂时隐藏一些或所有第三方图标(当你有十几个图标时,它会变得有点疯狂).
一个示例实现是Bartender(https://www.macbartender.com).我想创建一个更简单的版本,其中菜单栏图标应用程序将在单击时切换除自身之外的所有其他第三方图标.我不需要在其他任何地方显示图标.
看看Bartender,看起来需要一个具有管理员权限的帮助应用程序.更重要的是,如果我调试我的一个创建菜单栏项的应用程序,我在调度控制台中看到以下内容:
2016-12-06 10:14:47.936 MyApp[2747:22676] Bartender: Loaded BartenderHelperTwoOneThree
Run Code Online (Sandbox Code Playgroud)
所以看起来Bartender在这个过程中注入了它的帮手,不是吗?我刚刚验证了,Helper是一个BartenderHelper.osax文件/Library/ScriptingAdditions.此包包含具有相同名称的二进制PlugIns文件,以及包含的文件夹BartenderHelperTwoOneThree.bundle,其本身包含同名的二进制文件.
我不知道在哪里看,我搜索SO和谷歌到目前为止没有给我任何东西.我没有沙箱限制.
谢谢.
我将窗口的外观设置NSAppearanceNameVibrantDark为具有某种"黑暗"主题,其效果非常好.虽然不是纯黑的粉丝,但我想稍微减轻UI元素.
我将窗口的背景颜色设置为纯白色,这使得工具栏看起来是灰色的,这是完美的:
但在我的窗口中,我有一个NSTableView不受此更改影响的:
如你所见,一切都很暗,行的交替颜色几乎看不到.我想减轻这个,所以我尝试将NSTableView背景颜色设置为白色,它没有帮助.我尝试将封闭NSView CALayer的背景颜色设置为白色,这也没有帮助(我指定此视图需要具有wantsLayer属性的图层).
我最幸运的尝试是实现tableView(_: didAddRowView: forRow:)并手动设置行视图的颜色:
if row % 2 == 1 {
rowView.backgroundColor = NSColor(white: 0.4, alpha: 1)
} else {
rowView.backgroundColor = NSColor(white: 0.2, alpha: 1)
}
Run Code Online (Sandbox Code Playgroud)
但是,这不会影响我数据下方的空行,它们仍然非常暗.我希望空行与填充的行颜色相同.
谢谢 !
注意:我不关心标题行的背景颜色,它可以保持当前的灰色阴影.
我有一个带有活力的NSVisualEffectView,包含文本字段(NSTextField或NSComboBox)和无边框按钮.按钮位于文本字段上方,我想禁用无边框按钮上的活力效果,因为它们应该出现在文本字段的白色背景上.
根据NSVisualEffectView类引用中的建议,我尝试做的是将我的NSButton包装在另一个NSVisualEffectView中,并将其状态设置为Inactive.这样做是用浅灰色背景取代"充满活力"的背景.
下图说明了这一点.第一个字段是我尝试的解决方案,第二个字段显示无边框按钮的默认行为,作为NSVisualEffectView的子节点.
我还尝试了子类化NSButton并将其单元格背景颜色设置为白色或透明但我总是得到灰色背景.
如何将浅灰色背景更改为白色或透明背景?谢谢
我目前正在为我的macOS应用程序实现NSTouchBar api.
此时,我唯一的触控条有主视图控制器作为其委托,我可以很好地添加项目.问题是,我需要其中一些项目仅在满足某个条件时才会出现(在表格中选择了一行).
考虑我有一个布尔值,指示按钮是否应该可见.如果我的布尔值发生变化,如何动态更新NSTouchBar以显示/隐藏此按钮?(我不需要观察这个布尔值,我可以简单地调用我已经实现的另一种方法更新)
我现在做的是以下内容:在touchBar(:makeItemForIdentifier),我有一个所有标识符的开关,在正确的情况下case,我要么返回NSCustomTouchBarItem按钮,或者nil如果我的布尔值是false.
我makeTouchBar选择了一行表后尝试再次调用,但它没有更新按钮的可见性,就好像touchBar(:makeItemForIdentifier)没有再次调用一样.
谢谢!
我在AppKit API Reference中看到该insertText方法在OS X v10.11中已弃用.我应该用什么作为替代品呢?
我的Swift Xcode项目作为主类有一个NSViewController子类(此后是"主控制器"),它长到大约4k行高.与应用程序的主窗口和主要操作相关的大多数逻辑都在此文件中,作为类的方法.
这导致Xcode在自动完成和一般打字时非常慢.我想将逻辑分成几个较小的文件,这有望加快我的工作流程.我该怎么办呢?
如果我必须更具体,我猜我想要实现的是:将方法从这个主控制器移动到一个单独的文件/类,然后从主控制器调用我移动的任何这些方法(理想情况下,这单独的文件中的函数也可以调用主控制器内的其他方法).
是extension什么东西,可能在这个问题上帮助?
谢谢
我最近发现了外键和删除级联与 InnoDB 的奇妙之处,我喜欢它。它帮助我轻松删除复杂的数据结构,而不必担心留下垃圾。
我目前正在通过以下方式存储产品数据库的图像(就像您在网上商店中一样):
我的products表就是您所期望的,它有一个id主列。我的product_images表有一product_id列,该列有一个外键products.id,还有一个image列存储图像文件名的 varchar 类型。
文件名是通过计算图像的 SHA1 哈希值创建的,然后存储在以哈希值的前 2 个字符命名的文件夹中:
61/6153A6FA0E4880D9B8D0BE4720F78E895265D0A9.jpg。数据库中只有6153A6FA0E4880D9B8D0BE4720F78E895265D0A9.jpg存储。
现在,如果我要从数据库中删除产品,级联 DELETE 规则将删除product_images,但会将文件保留在我的服务器上。
有没有办法在删除表中的记录时自动删除图像文件product_images,无论是专门删除还是级联删除?也许将某种触发器或例程链接到删除操作?
我在 Swift 2 中以下列方式在我的项目中实现了快速查看(我将其包含在此处以供参考,因为它可能有助于其他人进行设置)。
我的 NSViewController 包含一个 NSTableView 子类,我在其中实现keyDown了侦听被按下的空格键(可能不是最好的方法,但它有效):
override func keyDown(theEvent: NSEvent) {
let s = theEvent.charactersIgnoringModifiers!
let s1 = s.unicodeScalars
let s2 = s1[s1.startIndex].value
let s3 = Int(s2)
if s3 == Int(" ".utf16.first!) {
NSNotificationCenter.defaultCenter().postNotification(NSNotification(name: "MyTableViewSpacebar", object: nil))
return
}
super.keyDown(theEvent)
}
Run Code Online (Sandbox Code Playgroud)
在我的视图控制器中,我有一个观察者来观察这个通知和所需的功能QLPreviewPanel:
//...
class ViewController: NSViewController {
@IBOutlet weak var myTableView: MyTableView!
var files = [FilesListData]() //array of custom class
//...
override func viewDidLoad() {
//...
NSNotificationCenter.defaultCenter().addObserver(self, selector: "spaceBarKeyDown:", name: "MyTableViewSpacebar", object: nil) …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Cocoa 应用程序中从 NSAppleScript 编写 iTunes 脚本,以便将文件添加到库中。
在我的权利文件中,我添加了以下内容:
<key>com.apple.security.scripting-targets</key>
<dict>
<key>com.apple.itunes</key>
<array>
<string>com.apple.itunes.library.read-write</string>
</array>
</dict>
Run Code Online (Sandbox Code Playgroud)
然后我这样调用 AppleScript:
var error: NSDictionary? = nil
let appleScript = NSAppleScript(source: "tell application \"iTunes\" to add (POSIX file \"\(path)\") to library playlist 1")
let result = appleScript?.executeAndReturnError(&error)
Run Code Online (Sandbox Code Playgroud)
但它失败并出现错误-10004:iTunes got an error: A privilege violation occurred.
itunes我尝试以两种方式(和)大写 iTunes iTunes,但似乎没有任何效果。我还尝试在读写权利之上添加read权利。最后,我尝试添加对用户音乐文件夹(存储 iTunes 库的位置)的读写访问权限,但这也没有帮助。
为了编写 iTunes 脚本,是否还需要我不知道的其他权利?
我在搜索解决方案时找到了此链接(链接),但它要求用户在其文件夹中选择一个特定文件夹,Library以授予应用程序用户选择的文件访问权限,然后要求脚本位于一个单独的文件中,该文件为 2对于我想做的事情来说太多了。我不信任用户对脚本文件的管理,并且我不需要 1 行 AppleScript 代码的文件。据我了解,另一个缺点NSUserAppleScriptTask是您无法在多个调用中保留脚本的状态,这对我来说不是问题,但对其他人来说可能是问题。
谢谢
我是angular.js和node-webkit的新手,我正在努力使引导工具提示在通过ng-repeat动态加载的内容中工作.
首先,我尝试使用标准引导程序并执行以下操作:http: //jsfiddle.net/nsDFe/3/
app.directive('bsTooltip', function () {
return function (scope, element, attrs) {
// trying to register the new tooltips
element.find('span').tooltip();
};
});
Run Code Online (Sandbox Code Playgroud)
这不起作用(但第一个表行中的"通常"定义的工具提示有效).
然后我尝试使用angular-ui bootstrap并做了以下(认为它应该是一种"自动",角度库将听取新的dom元素):http: //jsfiddle.net/XTG8k/2/
但也没有运气.有人能指出我正确的方向吗?我在Stackoverflow上看到了一些关于这方面的讨论,但没有一个真正解决了我的问题.我听说过对$ compile的一些含糊的引用,但是无法想出如何实现它.
tooltip twitter-bootstrap angularjs ng-repeat angular-ui-bootstrap
我的应用程序在 NSTableView 中列出音频文件 (MP3),每行的对象都包含音频文件的路径。我希望在选择一行时按下空格键时能够使用“快速查看”(如在 Finder 中)预览音频文件。
通过查看相关问题和答案,我注意到该 API 似乎是私有的,因此很难找到有关此内容的最新可靠信息或文档,更不用说在 Swift 中了。更重要的是,我发现的大多数示例都与图像预览有关,有些实际上提到了 Xcode 的“调试快速查看”,这根本不是我感兴趣的。
我见过一个 FTP 客户端,它可以对 Finder 可以预览的任何文件进行快速查看预览,因此我猜测可以在应用程序中使用它,特别是在本机支持文件格式的情况下。
有人能指出我正确的方向吗?
cocoa ×7
swift ×6
macos ×5
nstableview ×2
quicklook ×2
swift2 ×2
angularjs ×1
appkit ×1
applescript ×1
background ×1
database ×1
innodb ×1
keydown ×1
mp3 ×1
mysql ×1
ng-repeat ×1
nsbutton ×1
nstextview ×1
nstouchbar ×1
tooltip ×1
triggers ×1
xcode ×1