iOS项目开发实战(Swift)—代理的使用

代码中用到了代理,就是将DataRequest中解析的Json串传到ViewController中进行TableViewCell的绘制,详情请见注释!

//
//  Protocol.swift

import Foundation

protocol DataRequestDelegate{
    func changeJson(item:AnyObject)
}


//
//  DataRequest.swift

import Foundation
import Alamofire

class DataRequest: NSObject{
    var item:[TableViewCellModel] = []
    var num:Int?
    var delegate:DataRequestDelegate?
    
   
    func alamofireRequest(){
        var model:TableViewCellModel!
        //Alamofire的异步问题
        Alamofire.request(.GET, "http://m.paopao.163.com/m/v2/getDiscover", parameters: ["foo": "bar"])
            .responseJSON { response in
                if let JSON = response.result.value {
                    if let json = JSON.objectForKey("result")?.objectForKey("list"){
                        self.num = json.count
                        for var i = 0; i<json.count; i = i + 1{
                            let str1 = json[i].objectForKey("title")as! String
                            let str2 = json[i].objectForKey("subTitle")as! String
                            let str3 = json[i].objectForKey("imageUrl")as! String
                            model = TableViewCellModel(titleName: str1, subTitleName: str2, imageUrlName: str3)
                            self.item.append(model)
                        }
                        //调用代理方法
                        self.delegate?.changeJson(self.item)
                    }
                }
        }
    }
}

//
//  MyTableViewCellModel.swift

import Foundation

class TableViewCellModel: NSObject{
    var titleName:String!
    var subTitleName:String!
    var imageUrlName:String!
    
    init(titleName:String,subTitleName:String,imageUrlName:String){
        self.titleName = titleName
        self.subTitleName = subTitleName
        self.imageUrlName = imageUrlName
    }
}

//
//  discoveryViewController.swift

import UIKit
import Alamofire

class discoveryViewController: UIViewController,UITableViewDataSource,UITableViewDelegate,DataRequestDelegate {
    var tableView = UITableView()
    let size = UIScreen.mainScreen().bounds
    //定义数组
    var items:[TableViewCellModel] = []
    var num:Int!
    
    //代理方法的实现
    func changeJson(item: AnyObject) {
        self.items = item as! [TableViewCellModel]
        self.tableView.reloadData()
//        print(self.items)
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationItem.title = "发现"
        tableView = UITableView(frame: CGRectMake(0, 0, size.width, size.height), style: UITableViewStyle.Plain)
         tableView.rowHeight = 60
        
        //网络请求
        let request = DataRequest()
        request.delegate=self
        request.alamofireRequest()
        
        tableView.delegate = self
        tableView.dataSource = self
        self.view.addSubview(tableView)

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }  
    
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }
    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let initIdentifier = "Cell"
        //访问缓存池
        var cell = self.tableView.dequeueReusableCellWithIdentifier(initIdentifier)
        //如果cell为空,则重新创建
        if (cell == nil) {
            cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: initIdentifier)
        }
        let model:TableViewCellModel = self.items[indexPath.row]
        cell?.textLabel!.text = model.titleName
        cell?.detailTextLabel!.text = model.subTitleName
        cell?.imageView!.image = UIImage(data: NSData(contentsOfURL: NSURL(string: model.imageUrlName)!)!)
        
        cell!.imageView!.layer.cornerRadius = 40
        cell!.imageView!.layer.masksToBounds = true
        
        return cell!
    }
    
    //当执行异步请求的时候,如果count为0的时候,就不绘制,等到有数据了再reloadData就可以绘制cell
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return items.count
    }
    
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        let webView = UIWebView(frame: UIScreen.mainScreen().bounds)
        let request = NSURLRequest(URL: NSURL(string: "http://www.baidu.com")!)
        webView.loadRequest(request)
        self.view.addSubview(webView)
    }

    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return 80
    }
}

总结:

通常,一个delegate的使用过程,需要经过五步:

1.     创建一个 delegate;

2.    委托者声明一个delegate;

3.    委托者调用delegate内的方法(method);

4.    被委托者设置delegate,以便被委托者调用;

5.    被委托者实现Delegate 所定义的方法。



  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值