swift 新闻列表实现

前端之家收集整理的这篇文章主要介绍了swift 新闻列表实现前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

这个例子综合了前面两篇,利用oc框架和自定义cell,做出一个新闻列表出来,顺便补充一下上篇漏掉的一下东西、

效果

这个例子很典型,大致分为下面几个步骤实现:
1、网络请求
2、json解析
3、自定义cell填充数据
4、点击cell跳转至webview

其实前面几步前面几篇博客已经说过了,不过有一个地方需要注意一下,json解析若有数组在里面,需要重写NSObject类中一个方法

1、网络请求&json解析

let manager = AFHTTPSessionManager()
        let ceshi = "习近平"
        let encode = ceshi.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)

        let url = "http://op.juhe.cn/oneBox/news/query?key=f75b0b456907bb042290c9a838e71f3e&q="+encode!
        tableview.rowHeight = 100

        manager.GET(url,parameters: nil,success: { ( datatask :NSURLSessionDataTask,object :AnyObject?) in
            //回调在主线程,这里可以去做ui操作


            let weat = NewsBean.mj_objectWithKeyValues(object)
            NSLog("请求成功"+weat.reason )

            self.arrays = weat.result

            NSLog("----%@",NSThread.currentThread() )

            self.tableview.reloadData()

            },failure: { (datask,object) in
                NSLog("请求失败%@",object)
        })

现在来看看实体类

class NewsBean: NSObject {

    var reason : String!
    var error_code : NSNumber!
    var result : Array<New>!


    //数组必须这么做!!
    override static func mj_objectClassInArray() -> [NSObject : AnyObject]! {
        return ["result": New.self]
    }

    class New: NSObject {

        var title :String!
        var content :String!
        var img_width :String!
        var full_title :String!
        var pdate :String!
        var src :String!
        var img_length :String!
        var img :String!
        var url :String!
        var pdate_src :String!

    }

}

result字段是一个数组,并且里面是一个对象,这个时候需要告诉mj框架,数组中存的是什么对象
override static func mj_objectClassInArray() -> [NSObject : AnyObject]! {
return [“result”: New.self]
}
所以重写这个方法,(写法和oc的区别很大、试了好多才成功~-~)

这么一来,数据就是得到了,并且赋值给成员变量arrays,然后tableview重新装填数据。

2、xib自定义cell

xib自定义cell是一个挺不错的选择,不需要自己去计算坐标,可以利用到自动布局的好处,在每个cell高度一样的情况下,是一个很不错的选择、(高度自适应其实也行,不过毕竟麻烦就是)

多用用自动布局,感觉蛮好的、布局就自个看着办啦
把xib文件弄好了,就新建个类继承uitableviewcell,然后把这个类配置给xib、开始连线~~~

class NewsCell: UITableViewCell {

    @IBOutlet weak var iconview: UIImageView!
    @IBOutlet weak var timeview: UILabel!
    @IBOutlet weak var scrouseview: UILabel!
    @IBOutlet weak var contentlableview: UILabel!
    @IBOutlet weak var titlelableview: UILabel!

    override func awakeFromNib() {

        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(selected: Bool,animated: Bool) {
        super.setSelected(selected,animated: animated)

        // Configure the view for the selected state
    }

}

下面在tableview里面使用xib

override func tableView(tableView: UITableView,cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
//注意名字要和xib文件的名字一致!
        let nsarray : NSArray = NSBundle.mainBundle().loadNibNamed("news",owner: nil,options: nil)
        let cell : NewsCell = nsarray.lastObject as! NewsCell
        let news = arrays[indexPath.row]

        let htmlstring = news.content
        let attrstring = try! NSAttributedString(data: htmlstring.dataUsingEncoding(NSUnicodeStringEncoding)!,options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],documentAttributes: nil)

        cell.titlelableview.text = news.full_title
        cell.contentlableview.numberOfLines=2
        cell.contentlableview.attributedText = attrstring
        cell.scrouseview.text = news.src
        cell.timeview.text = news.pdate

        NSLog("图片url"+news.img)

        cell.iconview.sd_setImageWithURL(NSURL(string:news.img))
        return cell

    }

=、= 这里image有个方法sd_setImageWithURL、这个是sdimageload框架的方法,用于显示图片,引入oc第三方库的方法前面已经说过了

这里需要注意的是导包的问题,我们这里只需要用image的方法,所以我们导入image 的分类文件就好了

如此,列表就显示出来了

3、跳转至webview

涉及到了界面的传值问题,ios还是比Android好的多啊,不需要迷之intent~~~~

因为你要push之前,是需要新建这个类的、那既然类的实例都有了,自然想怎么搞就这么搞~~~

class NewsDetailController: UIViewController {

    var newbean: NewsBean.New!

    override func viewDidLoad() {
        super.viewDidLoad()

        navigationItem.title = newbean.title

        let webview = UIWebView()

        webview.frame = CGRectMake(0,0,view.frame.width,view.frame.height)

        webview.loadRequest(NSURLRequest(URL: NSURL(string: newbean.url)!))

        view.addSubview(webview)
        // Do any additional setup after loading the view.
    }



}

只需要新建一个实体类对象就好,然后在cell点击事件那里赋值

override func tableView(tableView: UITableView,didSelectRowAtIndexPath indexPath: NSIndexPath) {
        NSLog("点击了第几项%d",indexPath.row)
        //跳转到webview显示数据!,利用navigation来实现跳转
        let detail = NewsDetailController ()
        detail.newbean = arrays[indexPath.row]
        self.navigationController?.pushViewController(detail,animated: true)

    }

新建这个类,把对象塞进去就好了~~、so easy

猜你在找的Swift相关文章