08-首页

作者: 月下独酌灬 | 来源:发表于2016-05-29 20:12 被阅读30次

首页

课程目标

  • 网络 JSON 转模型
  • 自定义 Cell

接口定义

文档地址

http://open.weibo.com/wiki/2/statuses/home_timeline

接口地址

https://api.weibo.com/2/statuses/home_timeline.json

HTTP 请求方式

  • GET

请求参数

参数 描述
access_token 采用OAuth授权方式为必填参数,其他授权方式不需要此参数,OAuth授权后获得
since_id 若指定此参数,则返回ID比since_id大的微博(即比since_id时间晚的微博),默认为0
max_id 若指定此参数,则返回ID小于或等于max_id的微博,默认为0

测试 URL:https://api.weibo.com/2/statuses/home_timeline.json?access_token=2.00ml8IrFLUkOXB32bb2d4ddd0u2gmj

微博数据模型

加载微博数据

  • HMHomeTableViewController 中添加加载微博数据方法
/// 加载微博数据的方法
private func loadData() {
    // 定义 url 与参数
    let urlString = "https://api.weibo.com/2/statuses/friends_timeline.json"
    let params = [
        "access_token": HMUserAccountViewModel.sharedUserAccount.accessToken!
    ]

    HMNetworkTools.shareTools.request(.GET, url: urlString, params: params) { (result, error) -> () in
        if error != nil {
            print("加载失败\(error)")
            return
        }
        print(result)
    }
}
  • 执行方法加载微博数据
override func viewDidLoad() {
    super.viewDidLoad()

    if !UserAccountViewModel.sharedUserAccount.userLogon {
        visitorView?.setupInfo(nil, message: "关注一些人,回这里看看有什么惊喜")
        return
    }
    loadData()
}

运行测试

定义微博模型

  • 定义微博模型
/// 微博模型
class HMStatus: NSObject {

    // MARK: - 模型属性
    /// 创建时间
    var created_at: String?
    /// 微博ID
    var id: Int = 0
    /// 微博信息内容
    var text: String?
    /// 微博来源
    var source: String?

    init(dict: [String: AnyObject]) {
        super.init()
        setValuesForKeysWithDictionary(dict)
    }

    override func setValue(value: AnyObject?, forUndefinedKey key: String) {}
}
  • 将返回数据字典转模型
HMNetworkTools.shareTools.request(.GET, url: urlString, params: params) { (result, error) -> () in
    ...
    // 加载成功
    guard let statusesDict = result?["statuses"] as? [[String: AnyObject]] else {
        return
    }
    // 字典转模型

    // 定义临时数据
    var tempArray = [HMStatus]()
    for statusDict in statusesDict {
        let status = HMStatus(dict: statusDict)
        tempArray.append(status)
    }
}
  • 定义微博列表视图模型 HMStatusListViewModel
/// 微博数组视图模型
class HMStatusListViewModel: NSObject {

    // 微博数组
    var statuses: [HMStatus]?
}
  • 将加载数据的方法移动至 HMStatusListViewModel
/// 加载微博数据的方法
func loadData(completion: (isSuccessed: Bool)->()) {
    // 定义 url 与参数
    let urlString = "https://api.weibo.com/2/statuses/friends_timeline.json"
    let params = [
        "access_token": HMUserAccountViewModel.sharedUserAccount.accessToken!
    ]

    HMNetworkTools.shareTools.request(.GET, url: urlString, params: params) { (result, error) -> () in
        if error != nil {
            print("加载失败\(error)")
            completion(isSuccessed: false)
            return
        }
        // 加载成功
        guard let statusesDict = result?["statuses"] as? [[String: AnyObject]] else {
            return
        }
        // 字典转模型

        // 定义临时数据
        var tempArray = [HMStatus]()
        for statusDict in statusesDict {
            let status = HMStatus(dict: statusDict)
            tempArray.append(status)
        }
        self.statuses = tempArray
        completion(isSuccessed: true)
    }
}
  • HMHomeTableViewController 中增加微博视图模型属性
/// 微博列表视图模型
lazy var statusListViewModel = HMStatusListViewModel()
  • 修改 loadData 函数
// MARK: - 加载数据
statusLiseViewModel.loadData { (isSuccessed) -> () in
    if isSuccessed {
        print("加载成功")
    }else {
        SVProgressHUD.showErrorWithStatus("网络不好")
    }
}

运行测试,印象:由视图模型负责数据处理

显示表格数据

  • 定义可重用标识符
/// 表格标识符
private let HMStatusCellId = "HMStatusCellId"
  • viewDidLoad 中调用方法注册可重用 Cell
/// 设置tableView相关
private func setupTableView(){
    // 注册系统的cell
    tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: HMStatusCellId)
}
  • 实现数据源函数
// MARK: - Table view data source
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return statusListViewModel.statuses?.count ?? 0
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier(HMStatusCellId, forIndexPath: indexPath)
    cell.textLabel?.text = statusListViewModel.statuses![indexPath.row].text
    return cell
}

用户模型

定义模型

/// 用户模型
class HMUser: NSObject {
    /// 用户UID
    var id: Int = 0
    /// 友好显示名称
    var name: String?
    /// 用户头像地址(中图),50×50像素
    var profile_image_url: String?
    /// 认证类型 -1:没有认证,1:认证用户,2,3,5: 企业认证,220: 达人
    var verified: Int = 0
    /// 会员等级 1-6
    var mbrank: Int = 0

    // MARK: - 构造函数
    init(dict: [String: AnyObject]) {
        super.init()

        setValuesForKeysWithDictionary(dict)
    }

    override func setValue(value: AnyObject?, forUndefinedKey key: String) {}

    override var description: String {
        let keys = ["id", "name", "profile_image_url", "mbrank"]

        return dictionaryWithValuesForKeys(keys).description
    }
}

HMStatus 中针对用户模型增加处理

  • 增加属性
/// 微博作者的用户信息字段
var user: HMUser?

运行测试,会发现 user 字段被 KVO 设置成了字典

  • 修改 HMStatus 的构造函数
override func setValue(value: AnyObject?, forKey key: String) {
    // 判断 key 是否是 "user"
    if key == "user" {
        user = HMUser(dict: value as! [String: AnyObject])
        return
    }
    super.setValue(value, forKey: key)
}

自定义 cell

  • 建立 HMStatusCell 自定义 Cell
/// 微博 Cell
class HMStatusCell: UITableViewCell {

    // MARK: 搭建界面
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        setupUI()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    private func setupUI() {

    }
}
  • 建立微博视图模型
/// 微博视图模型
class HMStatusViewModel: NSObject {
    /// 微博模型
    var status: Status?

    /// 构造函数
    init(status: Status) {
        self.status = status
    }
}
  • 添加视图模型属性
/// 微博视图模型
var statusViewModel: HMStatusViewModel?
  • 修改 HMStatusListViewModel 中的网络代码中字典转模型部分
// 微博视图模型数组
var statuses: [HMStatusViewModel]?

...

// 字典转模型
if self.statuses == nil {
    self.statuses = [HMStatusViewModel]()
}
// 字典转模型
for dic in array {
    self.statuses?.append(HMStatusViewModel(status: HMStatus(dictionary: dic)))
}
  • 修改 HMHomeTableViewController 数据源方法
tableView.registerClass(HMStatusCell.self, forCellReuseIdentifier: HMStatusCellId)

...

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier(HMStatusCellId, forIndexPath: indexPath) as! HMStatusCell
    // 获取微博的视图模型
    let statusModel = statusListViewModel.statuses![indexPath.row]
    cell.textLabel?.text = statusModel.status?.user?.name
    return cell
}

单元格分析

微博的单元格包含以下 6 种类型:

  • 原创微博无图
  • 原创微博单图
  • 原创微博多图
  • 转发微博无图
  • 转发微博单图
  • 转发微博多图

自定义 Cell 中需要注意的

  • 单图会按照图片等比例显示
  • 多图的图片大小固定
  • 多图如果是4张,会按照 2 * 2 显示
  • 多图其他数量,按照 3 * 3 九宫格显示

相关文章

  • 学习HM微博项目第6天

    步骤:首页08-显示微博未读数 -> 首页09-自定义cell -> 首页10-计算cell子控件fram...

  • 08-首页

    首页 课程目标 网络 JSON 转模型 自定义 Cell 接口定义 文档地址 http://open.weibo....

  • 08-首页

    学习内容 类目Icon功能 底部猜你喜欢 上拉加载更多 下拉刷新 尾部视图处理 自定义顶部标签导航栏 根据网络数据...

  • Django笔记08-博客首页(2)

    博客首页 博客首页除了显示数据之外,还有登陆跳转、分页显示、搜索等 登陆  django 内置的后台管理应用就是处...

  • #08-手势识别(点按,长按,轻扫)#

    08-手势识别(点按,长按,轻扫)

  • UIView转场动画

    // CZViewController.m // 08-转场动画 // // Created by apple o...

  • html+css导航栏制作——20160313

    水平导航栏(一) HTML部分: 个人首页 个人首页 个人首页 个人首页 个人首页 个人首页 CSS部分: *{ ...

  • 2018-10-17测试

    搜狐博客首页-搜狐 搜狐博客首页-搜狐 搜狐博客首页-搜狐 搜狐博客首页-搜狐 搜狐博客首页-搜狐 搜狐博客首页-...

  • 病案首页功能

    首页管理 首页信息录入 首页信息查询 首页信息浏览 首页信息保存 首页字典管理 诊断信息字典 手术信息字典 病理信...

  • 08-作业

    1.写一个函数将一个指定的列表中的元素逆序(例如[1, 2, 3] -> [3, 2, 1])(注意:不要使用列表...

网友评论

      本文标题:08-首页

      本文链接:https://www.haomeiwen.com/subject/pbyqdttx.html