去年写过一个OC版本的瀑布流Demo《【iOS】UITableView实现的瀑布流效果》。

接触Swift一段时间了,今天就是用Swift再写了一个瀑布流的Demo。原理是一样的这里不再赘述。在写这个Demo的过程中是用到了NSURLConnection的异步网络请求和GCD做了一个图片的异步加载,没有做图片的缓存,所以是用起来有些卡。cell是带左滑删除视图的,删除功能是没有实现的。

效果图:



Demo工作流程:

1.制作三个tableiView

2.网络请求,获取图片数据模型(title和url等)

3.数据封装成模型

4.reload tableView

图片数据模型


代码:

PICModel.swift

import UIKit

class PICModel: NSObject {
    var album_id : NSNumber?
    var brand_name : String?
    var created_at : NSNumber?
    var height : NSNumber?
    var id : String?
    var new_height : NSNumber?
    var new_width : NSNumber?
    var pic_url_d : String?
    var pic_url_x : String?
    var price : String?
    var title : String?
    var width : NSNumber?
}
ViewController.swift
//
//  ViewController.swift
//  瀑布流-Swift
//
//  Created by zhuming on 16/3/29.
//  copyright © 2016年 zhuming. All rights reserved.
//

import UIKit

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UIAlertViewDelegate{

    var tableView1 : UITableView?
    var tableView2 : UITableView?
    var tableView3 : UITableView?
    var indexPath : NSIndexPath?
    var menbers1 = [NSDictionary]()
    var menbers2 = [NSDictionary]()
    var menbers3 = [NSDictionary]()
    var PICModelArray1 = [PICModel]()
    var PICModelArray2 = [PICModel]()
    var PICModelArray3 = [PICModel]()
    var dataArray = ["1","2","3","4","5","6","7","8","9","10","11","12"]
    let urlString1 = "http://itugo.com/client/ios/api/getpiclist?_version=20140117.2.5.1&_req_from=oc&_source=ios&type=&_uuid=efe47094e00109db8c28cf0ae9b607b9&max=&tag=&_promotion_channel=App%20Store&_platform=iPhone&sort=new&from=tag&_uiid=2FF998CF0D2A40E7AF6F8FAFB8F57538&_net=wifi&min=0";
    let urlString2 = "http://itugo.com/client/ios/api/getpiclist?_version=20140117.2.5.1&_req_from=oc&_source=ios&type=accessary&_uuid=efe47094e00109db8c28cf0ae9b607b9&max=&tag=&_promotion_channel=App%20Store&_platform=iPhone&sort=new&from=tag&_uiid=2FF998CF0D2A40E7AF6F8FAFB8F57538&_net=wifi&min=0";
    let urlString3 = "http://itugo.com/client/ios/api/getpiclist?_version=20140117.2.5.1&_req_from=oc&_source=ios&type=shoes&_uuid=efe47094e00109db8c28cf0ae9b607b9&max=&tag=&_promotion_channel=App%20Store&_platform=iPhone&sort=new&from=tag&_uiid=2FF998CF0D2A40E7AF6F8FAFB8F57538&_net=wifi&min=0";
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.initTableView()
        
        self.requestData(urlString1)
        self.requestData(urlString2)
        self.requestData(urlString3)
        
        // Do any additional setup after loading the view,typically from a nib.
    }
    /**
        初始化表格
     */
    func initTableView() {
        self.tableView1 = UITableView.init(frame: CGRectMake(5,20,100,548))
        self.tableView1!.delegate = self
        self.tableView1!.dataSource = self;
        self.tableView1?.showsverticalScrollIndicator = false
        self.tableView1!.registerNib(UINib(nibName:"PBTableViewCell",bundle:nil),forCellReuseIdentifier:"PBTableViewCell")
        self.view .addSubview(self.tableView1!)
        
        self.tableView2 = UITableView.init(frame: CGRectMake(110,548))
        self.tableView2!.delegate = self
        self.tableView2!.dataSource = self;
        self.tableView2?.showsverticalScrollIndicator = false
        self.tableView2!.registerNib(UINib(nibName:"PBTableViewCell",forCellReuseIdentifier:"PBTableViewCell")
        self.view .addSubview(self.tableView2!)
        
        self.tableView3 = UITableView.init(frame: CGRectMake(215,548))
        self.tableView3!.delegate = self
        self.tableView3!.dataSource = self;
        self.tableView3?.showsverticalScrollIndicator = false
        self.tableView3!.registerNib(UINib(nibName:"PBTableViewCell",forCellReuseIdentifier:"PBTableViewCell")
        self.view .addSubview(self.tableView3!)
        
    }
    // 网络请求数据
    func requestData(urlString : String){
        let url = NSURL(string: urlString)
        let request = NSURLRequest(URL:  url!)
        NSURLConnection.sendAsynchronousRequest(request,queue: NSOperationQueue.mainQueue()) { (response:NSURLResponse?,data:NSData?,error:NSError?) in
            let jsonResult:NSDictionary = try! NSJSONSerialization.JSONObjectWithData(data!,options:  NSJSONReadingOptions.MutableContainers) as! NSDictionary
            let dice:NSDictionary = (jsonResult["data"] as? NSDictionary)!
            
            if (url!.isEqual(NSURL(string: self.urlString1))){
                self.menbers1 = dice["data"] as! Array
                print("self.menbers = \(self.menbers1.count)")
                
                for value in self.menbers1{
                    let dice:NSDictionary = value
                    self.PICModelArray1.append(self .makePICModel(dice))
                }
                print("PICModelArray = \(self.PICModelArray1.count)")
                self.tableView1?.reloadData()
            }
            if (url!.isEqual(NSURL(string: self.urlString2))){
                self.menbers2 = dice["data"] as! Array
                print("self.menbers = \(self.menbers2.count)")
                
                for value in self.menbers2{
                    let dice:NSDictionary = value
                    self.PICModelArray2.append(self .makePICModel(dice))
                }
                print("PICModelArray = \(self.PICModelArray2.count)")
                self.tableView2?.reloadData()
            }
            if (url!.isEqual(NSURL(string: self.urlString3))){
                self.menbers3 = dice["data"] as! Array
                print("self.menbers = \(self.menbers3.count)")
                
                for value in self.menbers3{
                    let dice:NSDictionary = value
                    self.PICModelArray3.append(self .makePICModel(dice))
                }
                print("PICModelArray = \(self.PICModelArray3.count)")
                self.tableView3?.reloadData()
            }
        }
    }
    // 数据封装成模型
    func makePICModel(dice : NSDictionary) -> PICModel{
        let model = PICModel.init()
        model.album_id = dice["album_id"] as? NSNumber
        model.brand_name = dice["brand_name"] as? String
        model.created_at = dice["created_at"] as? NSNumber
        model.height = dice["height"] as? NSNumber
        model.id = dice["id"] as? String
        model.new_height = dice["new_height"] as? NSNumber
        model.new_width = dice["new_width"] as? NSNumber
        model.pic_url_d = dice["pic_url_d"] as? String
        model.pic_url_x = dice["pic_url_x"] as? String
        model.price = dice["price"] as? String
        model.title = dice["title"] as? String
        model.width = dice["width"] as? NSNumber
        return model
    }
    // UITableViewDelegate,UITableViewDataSource
    func tableView(tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
        if tableView.isEqual(self.tableView1) {
            return self.PICModelArray1.count
        }
        if tableView.isEqual(self.tableView2) {
            return self.PICModelArray2.count
        }
        if tableView.isEqual(self.tableView3) {
            return self.PICModelArray3.count
        }
        return 10;
    }
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1;
    }
    // 设置cell的高度
    func tableView(tableView: UITableView,heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        if tableView.isEqual(self.tableView1) {
            let model = self.PICModelArray1[indexPath.row] as PICModel
            let height = model.new_height as! CGFloat
            return height*0.5
        }
        if tableView.isEqual(self.tableView2) {
            let model = self.PICModelArray2[indexPath.row] as PICModel
            let height = model.new_height as! CGFloat
            return height*0.5
        }
        if tableView.isEqual(self.tableView3) {
            let model = self.PICModelArray3[indexPath.row] as PICModel
            let height = model.new_height as! CGFloat
            return height*0.5
        }
        return 10;
    }
    func tableView(tableView: UITableView,cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let identify:String = "PBTableViewCell"
        let cell:PBTableViewCell = tableView.dequeueReusableCellWithIdentifier(identify)
            as! PBTableViewCell
        cell.selectionStyle = UITableViewCellSelectionStyle.None
        
        var model:PICModel!
        
        if tableView.isEqual(self.tableView1) {
            model = self.PICModelArray1[indexPath.row] as PICModel
        }
        if tableView.isEqual(self.tableView2) {
            model = self.PICModelArray2[indexPath.row] as PICModel
        }
        if tableView.isEqual(self.tableView3) {
            model = self.PICModelArray3[indexPath.row] as PICModel
        }
        
       
        cell.titleLabel?.text = model.title
        // 异步加载图片
        dispatch_async(dispatch_get_global_queue(disPATCH_QUEUE_PRIORITY_DEFAULT,0)) {
            let data = NSData.init(contentsOfURL: NSURL(string: model.pic_url_x!)!)
            dispatch_async(dispatch_get_main_queue(),{ 
                cell.backImageView?.image = UIImage.init(data: data!)
            })
        }
        
        
        return cell
    }
    // 三个TableView 关联滚动
    func scrollViewDidScroll(scrollView: UIScrollView) {
        if scrollView.isEqual(self.tableView1) {
            self.tableView2?.setContentOffset((self.tableView1?.contentOffset)!,animated: false)
            self.tableView3?.setContentOffset((self.tableView1?.contentOffset)!,animated: false)
        }
        if scrollView.isEqual(self.tableView2) {
            self.tableView1?.setContentOffset((self.tableView2?.contentOffset)!,animated: false)
            self.tableView3?.setContentOffset((self.tableView2?.contentOffset)!,animated: false)
        }
        if scrollView.isEqual(self.tableView3) {
            self.tableView1?.setContentOffset((self.tableView3?.contentOffset)!,animated: false)
            self.tableView2?.setContentOffset((self.tableView3?.contentOffset)!,animated: false)
        }
    }
    
    func tableView(tableView: UITableView,didSelectRowAtIndexPath indexPath: NSIndexPath) {
        print("row = \(indexPath.row)")
    }
    
    func tableView(tableView: UITableView,titleForDeleteConfirmationButtonForRowAtIndexPath indexPath: NSIndexPath) -> String? {
        return "删除"
    }
    
    func tableView(tableView: UITableView,commitEditingStyle editingStyle: UITableViewCellEditingStyle,forRowAtIndexPath indexPath: NSIndexPath){
        self.indexPath = indexPath
        self.showAlView(indexPath)
    }
    // UIAlertView的使用
    func showAlView(indexPath :NSIndexPath){
        let alert = UIAlertView.init(title: "警告",message: "确定删除第\(indexPath.row + 1)行",delegate: self,cancelButtonTitle: "取消",otherButtonTitles: "确定")
        alert.show()
    }
    func alertView(alertView: UIAlertView,clickedButtonAtIndex buttonIndex: Int) {
        if (buttonIndex == 0) {
            NSLog("取消");
        }
        else{
            NSLog("删除\(self.indexPath!.row)")
        }
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // dispose of any resources that can be recreated.
    }
}

写在最后:

可能是写的Swift的代码写少了,感觉写起来没有OC顺手,然后自己慢慢体会……O(∩_∩)O哈哈~

Swift UITableView瀑布流/NSURLConnection异步网络请求的更多相关文章

  1. HTML5 canvas 瀑布流文字效果的示例代码

    这篇文章主要介绍了HTML5 canvas 瀑布流文字效果的示例代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. 小程序瀑布流解决左右两边高度差距过大的问题

    这篇文章主要介绍了小程序瀑布流解决左右两边高度差距过大的问题的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. HTML5 WebSocket实现点对点聊天的示例代码

    这篇文章主要介绍了HTML5 WebSocket实现点对点聊天的示例代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  4. 3种方式实现瀑布流布局小结

    这篇文章主要介绍了3种方式实现瀑布流布局小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  5. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

  6. ios – 声明NSDictionary并在Swift中添加键值对?

    我一直在尝试使用类类型键和值来声明一个NSDictionary,如下所示:这里,“Category”和“SubCategory”是全局类.我知道我不能将类类型用于关键字段.但是,无论如何,我应该做到这一点.有没有办法做到这一点?如何声明专门的NSDictionary或类似的东西来做到这一点?

  7. ios – 在Swift中将输入字段字符串转换为Int

    所以我非常擅长制作APP广告Swift,我试图在文本字段中做一些非常简单的输入,取值,然后将它们用作Int进行某些计算.但是’vardistance’有些东西不正确它是导致错误的最后一行代码.它说致命错误:无法解开Optional.None解决方法在你的例子中,距离是一个Int?否则称为可选的Int..toInt()返回Int?因为从String到Int的转换可能失败.请参阅以下示例:

  8. ios – Swift相当于`[NSDictionary initWithObjects:forKeys:]`

    Swift的原生字典是否与[NSDictionaryinitWithObjects:forKeys:]相当?假设我有两个带键和值的数组,并希望将它们放在字典中.在Objective-C中,我这样做:当然我可以通过两个数组迭代一个计数器,使用vardict:[String:Int]并逐步添加东西.但这似乎不是一个好的解决方案.使用zip和enumerate可能是同时迭代两者的更好方法.然而,这种方法

  9. ios – NSJSONSerialization崩溃的应用程序

    我有一本字典,当我记录它时显示…我正试图将它变成NSData,用于像这样的JSONWeb服务……但每次我运行它时,应用程序都会崩溃.字典正确形成,应用程序只是崩溃在这一行.在AppCode中,我收到崩溃报告……在Xcode中,应用程序停止,如果我尝试继续,它会因错误而停止…

  10. 如何在iOS中检测文本(字符串)语言?

    例如,给定以下字符串:我想检测每个声明的字符串中使用的语言.让我们假设已实现函数的签名是:如果没有检测到语言,则返回可选字符串.因此,适当的结果将是:有一个简单的方法来实现它吗?

随机推荐

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

返回
顶部