首页 > IPhone > 使用Swift开发一个MacOS的菜单状态栏App
2016
07-30

使用Swift开发一个MacOS的菜单状态栏App

猴子原创,欢迎转载。转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢!

原文地址: http://www.cocos2dev.com/?p=673

猴子原创,欢迎转载。转载请注明: 转载自Cocos2Der-CSDN,谢谢!
原文地址: http://blog.csdn.net/cocos2der/article/details/52054107

这两天突然想看看OSX下的App开发,看了几篇文章。下面这一篇我觉得入门是非常好的。我仅转述为中文,并非原文翻译。原文地址:http://footle.org/WeatherBar/

下面开始介绍如何使用Swift开发一个Mac Menu Bar(Status Bar) App。通过做一个简单的天气app。天气数据来源于OpenWeatherMap

完成后的效果如下:
使用Swift开发一个MacOS的菜单状态栏App - 第1张  | Cocos2D开发网

一、开始建立工程

打开Xcode,Create a New Project or File ⟶ New ⟶ Project ⟶ Application ⟶ Cocoa Application ( OS X 这一栏)。点击下一步。
使用Swift开发一个MacOS的菜单状态栏App - 第2张  | Cocos2D开发网

二、开始代码工作

  1. 打开MainMenu.xib,删除默认的windows和menu菜单。因为我们是状态栏app,不需要菜单栏,不需要主窗口。
    使用Swift开发一个MacOS的菜单状态栏App - 第3张  | Cocos2D开发网

  2. 添加一个Menu菜单
    使用Swift开发一个MacOS的菜单状态栏App - 第4张  | Cocos2D开发网
    删除其中默认的2个子菜单选项,仅保留1个。并将保留的这个改名为“Quit”。

  3. 打开双视图绑定Outlet

– 将Menu Outlet到AppDelegate,命名为statusMenu
使用Swift开发一个MacOS的菜单状态栏App - 第5张  | Cocos2D开发网

  • 将子菜单Quit绑定Action到AppDelegate,命名为quitClicked
    使用Swift开发一个MacOS的菜单状态栏App - 第6张  | Cocos2D开发网

  • 你可以删除 @IBOutlet weak var window: NSWindow! ,这个app中用不上。

  1. 代码

– 在AppDelegate.swift中statusMenu下方添加
let statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(NSVariableStatusItemLength)

  • applicationDidFinishLaunching函数中添加:

  • 在quitClicked中添加:

    • 此时你的代码应该如下:

运行,你可以看到一个状态栏了。

三、进阶一步,让App变得更好

你应该注意到了,当你运行后,底部Dock栏里出现了一个App启动的Icon。但实际上我们也不需要这个启动icon,打开Info,添加 “Application is agent (UIElement)”为YES。
使用Swift开发一个MacOS的菜单状态栏App - 第7张  | Cocos2D开发网

运行一下,不会出现dock启动icon了。

四、添加状态栏Icon

状态栏icon尺寸请使用18×18使用Swift开发一个MacOS的菜单状态栏App - 第8张  | Cocos2D开发网, 36×36(@2x)使用Swift开发一个MacOS的菜单状态栏App - 第9张  | Cocos2D开发网, 54×54(@3x),添加这1x和2x两张图到Assets.xcassets中。
使用Swift开发一个MacOS的菜单状态栏App - 第10张  | Cocos2D开发网

在applicationDidFinishLaunching中,修改为如下:

运行一下,你应该看到状态栏icon了。

五、重构下代码

如果我们进一步写下去,你会发现大量代码在AppDelegate中,我们不希望这样。下面我们为Menu创建一个Controller来管理。

  • 新建一个NSObject的StatusMenuController.swift, File ⟶ New File ⟶ OS X Source ⟶ Cocoa Class ⟶ Next
    使用Swift开发一个MacOS的菜单状态栏App - 第11张  | Cocos2D开发网

代码如下:

  • 还原AppDelegate,修改为如下:

注意,因为删除了AppDelegate中的Outlet注册,所以你需要重新连Outlet,但在这之前我们需要先做一件事。(你可以试试连接StatusMenuController中的Outlet,看看会怎么样?)

  • 打开MainMenu.xib,添加一个Object。
    使用Swift开发一个MacOS的菜单状态栏App - 第12张  | Cocos2D开发网
    将该Object的Class指定为StatusMenuController
    使用Swift开发一个MacOS的菜单状态栏App - 第13张  | Cocos2D开发网
    重建Outlet到StatusMenuController,注意删除之前连接到AppDelegate的Outlet
    使用Swift开发一个MacOS的菜单状态栏App - 第14张  | Cocos2D开发网

当MainMenu.xib被初始化的时候,StatusMenuController下的awakeFromNib将会被执行,所以我们在里面做初始化工作。

运行一下,保证你全部正常工作了。

六、天气Api

我们使用 OpenWeatherMap的天气数据,所以你得注册一个账号,获取到免费的API Key。

  • 添加WeatherAPI.swift, File ⟶ New File ⟶ OS X Source ⟶ Swift File ⟶ WeatherAPI.swift,加入如下代码,并使用你自己的API Key。

  • 添加一个Update子菜单到Status Menu。
    使用Swift开发一个MacOS的菜单状态栏App - 第15张  | Cocos2D开发网
    绑定Action到StatusMenuController.swift,取名为updateClicked

  • 开始使用WeatherAPI, 在StatusMenuController中let statusItem下面加入:
    let weatherAPI = WeatherAPI(),
    在updateClicked中加入:
    weatherAPI.fetchWeather("Seattle")

注意OSX 10.11之后请添加NSAppTransportSecurity,保证http能使用。

运行一下,然后点击Update菜单。你会收到一个json格式的天气数据。

  • 我们再调整下StatusMenuController代码, 添加一个updateWeather函数,修改后如下:

七、解析Json

你可以使用 SwiftyJSON,但本次我们先不使用第三方库。我们得到的天气数据如下:

  • 在WeatherAPI.swift添加天气结构体用于解析son

  • 解析son

  • 修改fetchWeather函数去调用weatherFromJSONData

如果此时你运行,你会收到

  • 给Weather结构体添加一个description

再运行试试。

八、Weather用到Controller中

  • 在 WeatherAPI.swift中增加delegate协议

  • 声明var delegate: WeatherAPIDelegate?

  • 添加初始化

  • 修改fetchWeather

  • StatusMenuController添加WeatherAPIDelegate

  • Callback实现,修改WeatherAPI.swift中fetchWeather:
    func fetchWeather(query: String, success: (Weather) -> Void) {
    修改fetchWeather内容

  • 在controller中

运行一下,确保都正常。

九、显示天气

在MainMenu.xib中添加子菜单 “Weather”(你可以添加2个Separator Menu Item用于子菜单分割线)
使用Swift开发一个MacOS的菜单状态栏App - 第16张  | Cocos2D开发网

在updateWeather中,替换NSLog:

运行一下,看看天气是不是显示出来了。

十、创建一个天气视图

打开MainMenu.xib,拖一个Custom View进来。

  • 拖一个Image View到Custom View中,设置ImageView宽高度为50。
    使用Swift开发一个MacOS的菜单状态栏App - 第17张  | Cocos2D开发网

  • 拖两个Label进来,分别为City和Temperature
    使用Swift开发一个MacOS的菜单状态栏App - 第18张  | Cocos2D开发网

  • 创建一个名为WeatherView的NSView,New File ⟶ OS X Source ⟶ Cocoa Class
    在MainMenu.xib中,将Custom View的Class指定为WeatherView
    使用Swift开发一个MacOS的菜单状态栏App - 第19张  | Cocos2D开发网

  • 绑定WeatherView Outlet:

并添加update:

注意这里使用dispatch_async调用UI线程来刷新UI,因为后面调用此函数的数据来源于网络请求子线程。

  • StatusMenuController添加weatherView outlet

  • 子菜单Weather绑定到视图

  • update中:

运行一下。

十一、添加天气图片

先添加天气素材到Xcode,天气素材可以在http://openweathermap.org/weather-conditions 这里找到。这里我已经提供了一份icon zip, 解压后放Xcode。
使用Swift开发一个MacOS的菜单状态栏App - 第20张  | Cocos2D开发网

  • WeatherAPI.swift的Weather struct中,添加 var icon: String

  • 在weatherFromJSONData中:

  • 在weatherFromJSONData:

  • 在WeatherView的update中:

运行一下,Pretty!

使用Swift开发一个MacOS的菜单状态栏App - 第21张  | Cocos2D开发网

十二、添加设置

在MainMenu.xib MenuItem中,添加一个Menu Item命名为“Preferences…”
并绑定action,命名为“preferencesClicked”

  • 添加NSWindowController命名为PreferencesWindow.swift New ⟶ File ⟶ OS X Source ⟶ Cocoa Class , 勾选同时创建XIB.在XIB中添加Label和Text Field。效果如下:
    使用Swift开发一个MacOS的菜单状态栏App - 第22张  | Cocos2D开发网

Outlet cityTextField到PreferencesWindow.swift

  • 在PreferencesWindow.swift中添加:

  • windowDidLoad()中修改:

  • 最终PreferencesWindow.swift如下:

  • StatusMenuController.swift中添加preferencesWindow
    var preferencesWindow: PreferencesWindow!

  • awakeFromNib中,注意在updateWeather()之前:
    preferencesWindow = PreferencesWindow()

  • preferencesClicked中:
    preferencesWindow.showWindow(nil)

  • 下面为 preferences window 添加NSWindowDelegate,刷新视图。
    class PreferencesWindow: NSWindowController, NSWindowDelegate {
    并增加

增加协议:

增加delegate:

在windowWillClose最下面调用

  • 回到StatusMenuController中,添加PreferencesWindowDelegate

实现代理:

awakeFromNib中:

  • 在StatusMenuController中增加默认城市
    let DEFAULT_CITY = “Seattle, WA”

  • 修改updateWeather

  • 咱们也可以在PreferencesWindow.swift windowDidLoad中设置city默认值

运行。一切OK。

其他:
– 你也可以试试使用NSRunLoop.mainRunLoop().addTimer(refreshTimer!, forMode: NSRunLoopCommonModes) 来定时updateWeather.
– 试试点击天气后跳转到天气中心 NSWorkspace.sharedWorkspace().openURL(url: NSURL))
– 完整工程: WeatherBar

最后编辑:
作者:Houzi
Write the code. Change the world.
捐 赠如果您觉得这篇文章有用处,请支持作者!鼓励作者写出更好更多的文章!

使用Swift开发一个MacOS的菜单状态栏App》有 25 条评论

  1. 送现金 说:

    使用Swift开发一个MacOS的菜单状态栏App - 第1张  | Cocos2D开发网 送88元 莎莎金沙网上投注专员Q:1813712617

  2. 穆兰悦 说:

    使用Swift开发一个MacOS的菜单状态栏App - 第1张  | Cocos2D开发网 性感美腿 使用Swift开发一个MacOS的菜单状态栏App - 第2张  | Cocos2D开发网 谁有av网站性感妹妹窝窝人体艺术奶茶妹妹 刘强东窝窝人体艺术aAY.meimei666.com

  3. 美眉图 说:

    性感美腿קּ首页av人体艺术美女大胸人体艺术av bt美胸大高清图片www.mm520.gq

  4. 魏枫 说:

    注册立送88元 使用Swift开发一个MacOS的菜单状态栏App - 第1张  | Cocos2D开发网 金赞QQ:1813712617

  5. 感觉笔者站的角度很高,观点很有意思,值得琢磨,但准确与否有待时间来验证

  6. 感觉笔者站的角度很高,观点很有意思,值得琢磨,但准确与否有待时间来验证

  7. 文莱好富有啊!让我去死,。,,

  8. 文莱好富有啊!让我去死,。,,

  9. 文莱好富有啊!让我去死,。,,

  10. 文莱好富有啊!让我去死,。,,

  11. 这个关注点有问题吗?只要不是扭曲事实

  12. 这个关注点有问题吗?只要不是扭曲事实

  13. 这个关注点有问题吗?只要不是扭曲事实

  14. 这个关注点有问题吗?只要不是扭曲事实

  15. 这个关注点有问题吗?只要不是扭曲事实

  16. 这个关注点有问题吗?只要不是扭曲事实

  17. 这个关注点有问题吗?只要不是扭曲事实

  18. ………………………………………..

  19. ………………………………………..

留下一个回复

你的email不会被公开。