• OS X应用开发现状
  • 目标设计
  • 后台数据Api
  • Xcode Start
  • 新建项目
  • 布局
    • 取消缩放
    • 设置Window居中
    • Layout
  • 设置ViewController背景
  • 初始化UI,建立Outlet
  • Cocoapod导入第三方开源库
  • 使用Alamofire获取远程api天气数据并显示
  • 显示网络图片
  • 解析数据并显示在CollectionView
  • THE END

OS X应用开发现状

  • Mac OS普及程度低,市场需求低
  • 网上教程太少,极客学院没有相关的视频,cocoachina翻了10分钟没找到个入门教程。
  • OC/Swift程序员大多都去开发iPad/iPhone的App
  • 当当的书就只有两本仅仅提到了OS X的,其他都是iOS。(我都买了也看了)
  • 国内程序员们靠OS X 的Appstore赚钱的太少。

还好,过年假期,我现在有这个时间来研究,也有这个兴趣来研究。。。。

该App涉及技术点:

  • Xcode Auto Layout
  • NSViewController
  • NSTextField
  • NSCollectionView【坑太多】
  • NSImageView
  • CocoaPods
  • Alamofire
  • SwiftyJSON

目标设计

首先用Sketch花了1个小时时间设计了一个App的UI.因为不想把第一个完整App做的有阴影,看着不爽,也想顺便体验切图的流程。

其实还有两个功能没有设计上去,一个是穿衣指数,另外就是城市切换,当然本来想的是每个城市有个不同的背景图片会更好。这个有时间再去迭代.

Sketch的plugin很好用,之前的设计师们在PS里面切图还是很苦逼的事情,现在基本上点几下鼠标就OK。

其实我开着Sketch也不用标坐标给自己看...导出几张背景图搞定。

后台数据Api

天气预报的数据网上大把,juhe.cn或者apistore.baidu.com有很多,用的URL不公布了,json格式如下:

{
    ret: 0,city: "北京",weather: [
        {
            date: "2016-02-13",week: "星期六",lunar: "正月初六",temp: "-6℃~4℃",weather: "阴转多云",wind: "北风4-5 级",fl: "",img: "http://mobile.weather.com.cn/images/dayb/02.png",dressing_index: "冷",dressing_advice: "天气冷,建议着棉服、羽绒服、皮夹克加羊毛衫等冬季服装。年老体弱者宜着厚棉衣、冬大衣或厚羽绒服。",uv_index: "弱"
        },{
            date: "2016-02-14",week: "星期日",lunar: "正月初七",temp: "-6℃~1℃",weather: "晴",wind: "微风",img: "http://mobile.weather.com.cn/images/dayb/00.png"
        },...
    ]
}

Xcode Start

新建项目

首先创建一个OS X的 Application


下一步选择使用Swift

布局

首先把切图拖入Assets.xcassets文件夹

然后单击Main.storyBoard进入UI界面(Interface Builder)

取消缩放

取消OS X 的最大化与窗口缩放功能,是因为UI设计不允许全屏使用

设置Window居中

默认App打开时与所在的设备相对位置,这里设为水平垂直居中

Layout

点击ViewController里面的View开始拖入控件并AutoLayout,Layout方式与iOS相同,尽量使用autolayout,Update Frames后,保证没有waring.

按住Ctrl然后拖动当前的imageView到父级的VIew就可以设置与父级view的位置关系,从而确定imageView的位置,如果在确定ImageView位置计算上存在分歧(ambiguous)就会出现waring,虽然可能不会影响程序运行结果,但是我们是严谨的程序员不是么?...为什么允许waring存在。

依次按照布局画好,另外布局有两种方案,就是是否启用nsstackview的问题,nsstackview有vertical horizontal两种,类似Android里面的Linearlayout,主要作用是在窗口缩放,以及动画的时候,能保持很好的相对比例,不至于UI错乱,另外的作用就是动态创建时,代码赶紧很多不需要额外的写constraints代码。
如下所示,布局花费时间比较长。

另外的方案不使用StackView直接布局
整体页面比较简单:

完成后如下所示:

详细请搜索[swift AutoLayout]

设置ViewController背景

我在Interface Builder没找到更改NSView背景的方法,采用了如下代码方式解决。

1.最外层的NSView拖到ViewController中,建立Outlet,命名为Box

2.ViewController.swft viewDidLoad(){}中增加

self.view.wantsLayer = true

3.ViewController.swft viewWillAppear(){}中增加

//background为Assets.xcassets中资源名称
Box.layer?.backgroundColor = NSColor(patternImage:NSImage(named: "background")!).CGColor

初始化UI,建立Outlet

把需要操作的NS对象从Interface Builder选择Referencing Outlets然后拖到编辑器中。

会自动创建以下代码

@IBOutlet weak var windLevel: NSTextField!
    @IBOutlet weak var dateLabel: NSTextField!
    @IBOutlet weak var weatherText: NSTextField!
    @IBOutlet weak var tempLabelLow: NSTextField!
    @IBOutlet weak var tempLabelHigh: NSTextField!
    @IBOutlet weak var weatherIcon: NSImageView!

Cocoapod导入第三方开源库

1.在命令行依次执行以下代码,安装cocoapods:

#更换taobao镜像
gem sources --add https://ruby.taobao.org/ --remove https://rubygems.org/

#安装cocoapods
sudo gem install cocoapods

2.关闭Xcode项目,进入项目目录,在Weather-Forcast.xcodeproj文件同级目录创建文件podfile,文件内容如下:

platform :osx,'10.11'
use_frameworks!
pod 'SwiftyJSON',:git => 'https://github.com/SwiftyJSON/SwiftyJSON.git'
pod 'Alamofire','~> 3.0'

3.打开Weather-Forcast.xcworkspace,注意不是之前的Weather-Forcast.xcodeproj
4.import Alamofire不报错说明导入正常,项目结构如下图所示

使用Alamofire获取远程api天气数据并显示

func getWeather(){
        
        let url = "http://some-weather-api-url/"
        Alamofire.request(.GET,url,parameters: ["foo": "bar"])
            .responseJSON { response in
               
                if let data = response.result.value {
                    ...                    
                }
                
                
        }

其中data实际为NSDictionary,可以直接使用

self.windLevel.stringValue = data["weather"]!![0]["wind"] as! String

将json数据显示到windLevel(NSTextField)
另外因为导入了SwiftyJSON也可以使用如下方式,优雅解析

let json = JSON(data)
self.windLevel.stringValue = json["weather"][0]["wind"].string

显示网络图片

显示图片第三方类库很多,这里采用原生的方式:

//获得远程图片URL
let imgurl = data["weather"]!![0]["img"] as! String

//转化为NSURL
let url:NSURL = NSURL(string:imgurl)!

//转为NSImage对象
self.weatherIcon.image = NSImage(byReferencingURL: url)

运行之后如下图所示

解析数据并显示在CollectionView

现在就剩下最恶心的NSCollectionView了,恶心的原因是XCode 7.2在Interface Builder的
NSCollectionView有个BUG,只要拖进来,默认的segue会直接报错提示:UnkNown segue relationship: Prototype

由于比较复杂,写在了这篇文章里面

Swift OS X NSColectonView显示网络列表数据

THE END

终于搞定了。。。忙活了一个假期 Oh~ 上班第一天就要下雨。。。:(

Swift开发笔记-Mac OS X 天气预报应用开发(Xcode7.2)的更多相关文章

  1. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  2. Xcode 8和iOS 10支持SwiftyJSON吗?

    我最近将我的SwiftiOS应用程序从Xcode7升级到Xcode8,并将部署平台从iOS9.3升级到iOS10.我的应用程序开始出现这样的错误:Modulefilewascreatedbyanolderversionofthecompiler:rebuild‘SwiftyJSON’andtryagain.我用Google搜索并在SOModulefilewascreatedbyanolderver

  3. xcode – 上传到App Store时进行身份验证

    只需为现有安装/文件夹创建备份,这很重要,因为在(新)安装期间,Transporter将删除以前的安装:现在运行以下命令来更新Transporter:希望这有助于某人.

  4. 无法验证iOS应用(已获得有效证书)

    当切换到优胜美地时,我干净安装了我的Mac,现在我在将iOS提交到商店时遇到了问题.当我验证我的存档时,我不断收到“您的帐户已经拥有有效的iOS分发证书”.我已尝试从会员中心重命名和重新下载我的证书,但这不起作用.解决方法一个非常常见的“doh!”

  5. ios – bug编译alamofire – 未知选项字符`X’: – Xlinker

    尝试使用cocoapods将alamofire添加到项目中.Xcode版本:6.1.1版Podfile:这是错误:解决方法通过升级到Cocoapods0.36beta解决了这个问题.我也不得不删除旧版本.

  6. Xcode:如何导出开发人员配置文件以便在另一台Mac上导入它

    我需要从我的旧Mac导出我的开发者配置文件并将其导入另一台Mac,因为我收到以下错误:我发现我可以从这里导出它:但在我的Mac上我有2个帐户,如果我点击导出帐户,我是否导出它们?就像导出用于签署iOS开发证书的私钥并将其导入新Mac一样?

  7. iOS从UIWebview内容创建pdf

    哪个是从webview内容中获取最佳质量pdf文档的最佳选择?

  8. macos – 使用Xcode 4在Mac OS X Lion上设置SDL

    我一直试图让一个超级简单的SDL程序工作.我正在使用MacOSXLion.我有SDL在SNowLeopard工作,但它似乎不想在狮子身上工作.到目前为止我有这个:当我尝试编译此代码时,它给了我这个错误:如果我取消注释当前评论的#ifdef内容,程序将编译,但随后会在SDL_SetVideoMode行上接收SIGABRT.我刚才在另一个程序中看到了这些注释的东西,我不确定我是否应该拥有它.我怎么能让这个工作?

  9. ios – “没有这样的模块’Alamofire’”将无法识别框架

    我正在尝试使用Swift将Alamofire添加到一个新的XCode项目中.我觉得我已经尝试了一切.每次我尝试添加进口Alamofire我得到“没有这样的模块”.我已按照https://github.com/Alamofire/Alamofire所述尝试安装,我尝试先手动完成,然后是Carthage和Cocoapods,但结果相同.我已经尝试删除DerivedData文件夹并重建项目,没有任何运气

  10. xcode – tvos:Alamofire框架的iTunesConnect验证失败:不包含bitcode

    解决方法我想你是在项目设置中用appletvsimulator提交Framework.检查此链接Carthageissue

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部