这个例子综合了前面两篇,利用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