• 目标
  • 创建CollectionView
  • 自定义Collection View Item
  • 代码部分

目标

将远程Api数据(Json)使用alamofire解析,使用swiftyjson格式化并显示到CollectionView中
远程返回的Json格式如下

{
    ret: 0,city: "深圳",weather: [
    {
        date: "2016-02-14",week: "星期日",lunar: "正月初七",temp: "10℃~19℃",weather: "小雨",wind: "东北风3-4 级",fl: "",img: "http://mobile.weather.com.cn/images/dayb/07.png",dressing_index: "较舒适",dressing_advice: "建议着薄外套、开衫牛仔衫裤等服装。年老体弱者应适当添加衣物,宜着夹克衫、薄毛衣等。",uv_index: "最弱"
    },{
        date: "2016-02-15",week: "星期一",lunar: "正月初八",temp: "9℃~13℃",weather: "小雨转阴",img: "http://mobile.weather.com.cn/images/dayb/07.png"
    },{
        date: "2016-02-16",week: "星期二",lunar: "正月初九",temp: "10℃~14℃",weather: "阴",wind: "微风",img: "http://mobile.weather.com.cn/images/dayb/02.png"
    },{
        date: "2016-02-17",week: "星期三",lunar: "正月初十 ",temp: "11℃~17℃",weather: "阴转多云",...
}

最终显示效果为:

创建CollectionView

首先在Interface Builder中拖入一个CollectionView

当前的Xcode 7.2 会提示错误:...Main.storyboard: UnkNown segue relationship: Prototype
这是Xcode 7.2的BUG,也许以后Apple会Fix

这里需要删除掉segue与Collection View Item,后面自己定义。

然后修改下CollectionView的属性
Scroll Diection为水平方向

还有两步操作进行关联

  • 将新建的CollectionView与ViewController建立Outlet,因为后面要在ViewController中在加载数据之后刷新CollectionView数据

  • 将CollectionView的datasource指向ViewController,也就是说ViewController同时充当CollectionView 的数据源

自定义Collection View Item

新建一个文件,选择OS X ->Source->Cocoa Class,并点击Next

输入Class:DayDetailsItem,继承自NSCollectionViewItem,同时创建XIB file

在DayDetailItem.swift中创建以下变量

@IBOutlet weak var weatherIcon: NSImageView!
@IBOutlet weak var tempLabel: NSTextField!
@IBOutlet weak var weekLabel: NSTextField!

打开新建的DayDetailsItem.xib,绘制布局

找到Object并拖动到Document Outline区域

并将Object的Class改为刚才创建的DayDetailItem

分别在三个元素点击右键,Reference Outlets中与Object关联

布局相关操作已经完成下面开始写Controller的代码部分

代码部分

打开ViewController.swift ,导入Alamofire

import Alamofire

让ViewController实现UICollectionViewDataSource

class ViewController: NSViewController,NSCollectionViewDataSource {
    ...
}

创建datas变量,保存API返回的JSON 数组

var datas: [JSON] = []

使用Alamofire获取数据

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 {
                    let result = JSON(data)
                    
                    //将json 数据中的每天数据数组赋值给到self.datas
                    self.datas = result["weather"].arrayValue
                    
                    //刷新CollectionView
                    self.dayDetailCollectionView.reloadData()                    
                }
                
                
        }

重写CollectionViewDataSource的两个方法

//定义CollectionView中Item的数量
func collectionView(collectionView: NSCollectionView,numberOfItemsInSection section: Int) -> Int {
        //datas为定义的[JSON]数据
        return self.datas.count
    }
    
//处理collectionView的Item 即DayDetailsItem  
func collectionView(collectionView: NSCollectionView,itemForRepresentedobjectAtIndexPath indexPath: NSIndexPath) -> NSCollectionViewItem {
        let item = collectionView.makeItemWithIdentifier("DayDetailsItem",forIndexPath: indexPath) as! DayDetailsItem
        
        /** indexPath.item为当前item的序号 从0开始
         *  另外item为DayDetailsItem,data成员变量在后面定义
         */
        item.data = self.datas[indexPath.item]
        
        
        return item
    }

打开DayDetailsItem.swift

//
//  DayDetailsItem.swift
//  Weather
//
//  Created by Kint on 16/2/13.
//  copyright © 2016年 Kint. All rights reserved.
//

import Cocoa

class DayDetailsItem: NSCollectionViewItem {

    @IBOutlet weak var weatherIcon: NSImageView!
    @IBOutlet weak var tempLabel: NSTextField!
    @IBOutlet weak var weekLabel: NSTextField!
    
    //data在赋值时去执行self.setupData(),用JSON格式方便API解析
    var data:JSON?{
        didSet{
            self.setupData()
        }
    }
    override func viewDidLoad() {
        super.viewDidLoad()

    }
    func setupData(){
        if let tempLabel = self.data?["temp"]{
            self.tempLabel.stringValue = tempLabel.string!
        }
        
        if let weekLabel = self.data?["week"]{
            self.weekLabel.stringValue = weekLabel.string!
        }
        
        if let icon = self.data?["img"]{
            let url:NSURL = NSURL(string:icon.string!)!
            self.weatherIcon.image = NSImage(byReferencingURL: url)
        }
    }
    
}

OK,Done!运行一下

现在按照API返回的数量超过5个,实际上这是可以滚动的。所以解析的时候只对前五个赋值即可。

Swift OS X NSColectonView显示网络列表数据的更多相关文章

  1. ios – 由于未捕获的异常终止应用程序“Texture Atlas Not Found”

    我创建了一个使用SpriteKit的简单动画项目.它运行良好,没有问题.当我将工作副本中的文件合并时,会出现该错误.以下是控制台中的消息:2013-10-0910:52:14.777MyProject[1550:a0b]*Terminatingappduetouncaughtexception‘TextureAtlasNotFound’,reason:‘TextureAtlasNotFound’我

  2. ios – 在Swift中找不到Double类型的初始化程序

    我想将我从文本字段获取的String值转换为Double值并存储它,但是我继续收到错误,它找不到类型为Double的intializer,该类型接受参数列表类型.如何解决这个问题?解决方法如果你有一个名为temp的String,你应该可以使用转换为Double值.

  3. ios – 将CALayer设置为SCNMaterial的漫反射内容

    过去几天,我一直在互联网上搜索无效.不幸的是,关于这个具体问题的苹果文档是模糊的,没有示例代码可用.什么似乎是你可能会问的问题?我试过玩漫漫的内容变换矩阵,但没有任何修改.我也尝试将UIView的大小调整为256×256,但是并没有修复任何东西.这是图层的代码:编辑甚至更严厉的是,如果我使用以下方式捕获视图的UIImage:并使用它作为弥漫的内容…一切工作完全正常吗?这是真的很奇怪和令人沮丧,因为图像的大小是完全一样的uiview的…

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

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

  5. Swift基础篇——可选类型

    可选类型

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

    运行一下现在按照API返回的数量超过5个,实际上这是可以滚动的。所以解析的时候只对前五个赋值即可。

  7. (Swift+iOS)字符串轨迹转贝塞尔曲线,实现动态写字效果

    前两天下载了一个Swift的HUD提示效果,偶然发现其中的提示效果上面的文字是动态书写的。

  8. Swift 实现二叉搜索树 —— 创建,最大,最小,查找,插入,删除,前驱,后继,中序遍历

    了解了二叉堆之后,二叉搜索树就好说了,就是一个节点,左边的子节点是不可能比他大的,右边的子节点是一定大于它的,想了半天终于把创建给写好了。创建最大值和最小值查找插入删除删除好做,但是得找到那个能顶替它原来位置的节点,我这里只是打印出来,因为没有父节点,不好去找,所以就没做。。前驱后继中序遍历就酱,还是蛮有成就感的。要是不对,咱们一起讨论,当然里面的一些极端情况我没有做判断,只是想着熟悉下思路。

  9. swift – 在所有成员初始化之前由关闭捕获的’self’

    我有可能猜到你遇到了并发问题.在对DarkSkyClient的异步调用返回之前,您可能正在尝试访问对象的属性.即,事件的顺序是……>初始化Weather对象,将temp设置为0>调用DarkSkyClient开始,在后台运行>读取临时变量–嘿,它是0!>调用DarkSkyClient完成,将temp设置为您真正想要的值.坏所以你真正需要做的是切换到控制模式的反转:如果您不熟悉使用异步API进行开发,那么阅读该主题是值得的.它可能非常棘手.希望这可以帮助!

  10. android – 如何将lat lng转换为Location变量?

    我在android中制作地图应用程序,我想在地图上获得2个位置,并查看它们之间的距离.我已经将当前位置作为“位置”变量.然而另一个地方被保存为两个变量:doublelat,lng;我检查了互联网,发现这种方法有助于:问题是我所拥有的“临时”不是“位置”,而是两个不同的双打.有没有办法将它们转换为位置?

随机推荐

  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,所以编译器会报错,现在来一一解决。

返回
顶部