m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

swiftの学習(xcodeのrssリーダーサンプル)

概要

  • RSS2.0専用
  • webview使用
  • なんか一覧表示がおかしい
  • ナビゲーション使用

実装

画面設計

f:id:m_shige1979:20141014001734p:plain

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
    }
    
}
実行

f:id:m_shige1979:20141014003538p:plain
f:id:m_shige1979:20141014003643p:plain

参考


iPhone - SwiftのRSS Readerを100行で作ったよ - Qiita

http://eure.jp/blog/swift_rss_kim/