swift 新闻列表实现

时间:2023-01-10 10:17:40

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

效果图
swift 新闻列表实现

swift 新闻列表实现

这个例子很典型,大致分为下面几个步骤实现:
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高度一样的情况下,是一个很不错的选择、(高度自适应其实也行,不过毕竟麻烦就是)
swift 新闻列表实现

多用用自动布局,感觉蛮好的、布局就自个看着办啦
把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 的分类头文件就好了
swift 新闻列表实现

如此,列表就显示出来了

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