swiftの学習(xcodeのrssリーダーサンプル)
概要
- RSS2.0専用
- webview使用
- なんか一覧表示がおかしい
- ナビゲーション使用
実装
画面設計
ViewController.swift
// // ViewController.swift // import UIKit class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, NSXMLParserDelegate{ // rss2.0 var rssUrl : NSURL! { didSet{ let request : NSURLRequest = NSURLRequest(URL:self.rssUrl) func completionBlock(data: NSData!, response: NSURLResponse!, error: NSError!) -> Void { var parser : NSXMLParser = NSXMLParser(data: data)! parser.delegate = self; parser.parse() } var task : NSURLSessionDataTask = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler:completionBlock) task.resume() } } @IBOutlet var table: UITableView! var items = [Dictionary<String, String>]() override func viewDidLoad() { super.viewDidLoad() request() } override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) table.reloadData() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func request(){ let url : NSURL = NSURL(string: "http://m-shige1979.hatenablog.com/rss")! items = [Dictionary<String, String>]() self.rssUrl = url } func numberOfSectionsInTableView(tableView: UITableView!) -> Int { return 1; } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{ // リストの件数を返す return self.items.count } // セルをitemsから設定する処理 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{ let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell")! cell.textLabel?.text = items[indexPath.row]["name"]! cell.detailTextLabel?.text = items[indexPath.row]["url"] cell.textLabel?.font = UIFont.systemFontOfSize(12) cell.textLabel?.numberOfLines = 0 return cell; } // セルをクリックした時に発生するイベント func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){ var idx = indexPath.row let controller = DetailController() var url:String = items[idx]["url"]! controller.url = url self.navigationController!.pushViewController(controller, animated: true) self.table.deselectRowAtIndexPath(indexPath, animated: true) } var parseKey = "" var titleStr = "" var titleUrl = "" var index = -1 // パースの最初に呼ばれる func parserDidStartDocument(parser: NSXMLParser!) { //println("parserDidStartDocument") index = -1 items = [Dictionary<String, String>]() } // タグの最初 func parser(parser: NSXMLParser!, didStartElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!, attributes attributeDict: NSDictionary!) { //println("parser didStartElement " + elementName) parseKey = "" if elementName == "item" { titleStr = "" items.append([ "name": "", "url": "" ]) index = items.count - 1 }else{ parseKey = elementName } } // タグの最後 func parser(parser: NSXMLParser!, didEndElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!) { //println("parser didEndElement " + elementName) parseKey = "" } // パース処理 func parser(parser: NSXMLParser!, foundCharacters string: String!) { //println("parser " + "foundCharacters") if index >= 0 { if parseKey == "title" { items[index]["name"] = items[index]["name"]! + string }else if parseKey == "link" { items[index]["url"] = string } } } // パースの最後に呼ばれる func parserDidEndDocument(parser: NSXMLParser!) { //println("parserDidEndDocument") //println("items = \(items.count)") // 再読み込み self.table.reloadData() } }
DetailContoller.swift
// // DetailController.swift // import UIKit class DetailController: UIViewController, UIWebViewDelegate{ var webview: UIWebView = UIWebView() var url:String = "" override func viewDidLoad() { super.viewDidLoad() loadAddressURL() } func loadAddressURL() { self.webview.frame = self.view.bounds self.webview.delegate = self; self.view.addSubview(self.webview) let requestURL = NSURL(string: self.url) let req = NSURLRequest(URL: requestURL!) self.webview.loadRequest(req) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func webView(webView: UIWebView!, shouldStartLoadWithRequest request: NSURLRequest!, navigationType: UIWebViewNavigationType) -> Bool { return true } }
実行