2017年5月16日火曜日

NSTimerを使って時計表示をしてみる(1)

timerの生成とRunloopへの登録...を同時に行う方法らしいです

1. タイマーを起動する
param3がtimerハンドラを指定
        NSTimer.scheduledTimerWithTimeInterval(
    0.01,     // 繰り返す時間(秒)
    target: self,
    selector: (#selector(ViewController.DispWatchCount)),  // ハンドラ
    userInfo: nil,
    repeats: true    //リピート実行
   )

2. timerハンドラの記述
    func DispWatchCount(){
       ...
    }
 
ちなみに等幅フォントとして時計表示部分は Courier 50.0 を使用

---
import UIKit

class ViewController: UIViewController {

    var count:Int = 0
   
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
       
        NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: (#selector(ViewController.DispWatchCount)), userInfo: nil, repeats: true)
       
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBOutlet weak var DispTime: UILabel!
    // Timer handler
    func DispWatchCount(){
        let date = NSDate()
       
        let formatter = NSDateFormatter()
        formatter.dateFormat = "HH:mm:ss:SS"
        let dispTime = formatter.stringFromDate(date)
       
        /* メンバーにアクセスする場合
        let calender = NSCalendar.currentCalendar()
        let component = calender.components([NSCalendarUnit.Year, NSCalendarUnit.Month, NSCalendarUnit.Day, NSCalendarUnit.Hour, NSCalendarUnit.Minute, NSCalendarUnit.Second], fromDate: date)
        let dispTime = String(component.hour) + ":" + String(component.minute) + ":" + String(component.second)
        */
        DispTime.text = dispTime
    }
}

2017年5月15日月曜日

JSONを読む(Array編)

こんな感じのJSONを読みます

{{"midashi":
[{"hoge":"1", "imageurl":"htt://www.hoge.com/uri01.png"},
 {"hoge":"2", "imageurl":"htt://www.hoge.com/uri02.png"},
 {"hoge":"3", "imageurl":"htt://www.hoge.com/uri03.png"}]
}

// NSUrlSessionの取得ハンドラ
    func onFinishGetUri(data: NSData?, res: NSURLResponse?, error: NSError?){
        var dict:NSDictionary
        do{
            dict = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
            let imageList = dict["midashi"] as! NSArray
           
            for image in imageList{
                let url = image["imageurl"] as! String
                print(url)
                getList.append(url)  // 詰め直してみる
            }
            // index0のurlを取得
            print(getList[0])           
        } catch {
            print("error")
            return
        }
    }

2017年5月14日日曜日

JSONを読む(Dictionary編)

こんな感じのデータのvalueを読みます
{"hogedata":"http://hoge.com/image/hoge.png"}




// NSUrlSessionのハンドラ
    func onFinishUri(data: NSData?, res: NSURLResponse?, error: NSError?){
        var dict:NSDictionary
        do{
            dict = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
            // let str = String(data)
            // print(str)        // {"hogedata":"http://hoge.com/image/hoge.png"}
            let uri = dict["hogedata"] as! String // URLを取得
            print(uri)
        } catch {
            print("error")
            return
        }
    }

2017年5月13日土曜日

NSUrlSessionでハンドラを指定して画像を取得・表示する

1. UIImageをMain.storyboardに貼る
2. UIImageからviewController.swiftにIBOutletを貼る
3. NSUrlSessinoで取得した時のハンドラを書く
    // 画像を取得した時に呼び出されるハンドラ
    func onFinishImage(data: NSData?, res: NSURLResponse?, error: NSError?){
        uiImage = UIImage(data: data!)!
        // バックグラウンドだとUIの処理が出来ないので、メインスレッドでUIの処理を行わせる.
        dispatch_async(dispatch_get_main_queue(), {
            self.uiImageView.image = self.uiImage
        })

        // 続きの処理があればこの辺に書いておく
    }
4. NSUrlSessinでデータを取得する処理を書く(データ取得後は↑のハンドラを呼び出すようにする)
    func getImageImg(uri:String){
        let url = NSURL(string: uri)
        let urlSession = NSURLSession.sharedSession()
        let task = urlSession.dataTaskWithURL(url!, completionHandler: onFinishImage)
        task.resume()
    }

5. ViewDidLoadなどで↑を呼び出す
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let urlString = "http://hogehoge.co.jp/hoge.img"
        getImageImg(urlString)
    }

2017年4月20日木曜日

AVSpeechSynthesizerでテキスト読み上げ

 テキストだけ差し替える方法があるかもしれないけど、読み上げテキストで初期化する方法でも大丈夫。

import UIKit
import AVFoundation

class ViewController: UIViewController {

    var talker = AVSpeechSynthesizer()
    let talkTxt = "こんにちわ、今日はいい天気ですね"
    let talkText2 = "テキスト2"
    let talkTextEng = "hello"
   
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
       
        // 読み上げ内容を初期化
        var utterance = AVSpeechUtterance(string: talkTxt)
        // 日本語
        utterance.voice = AVSpeechSynthesisVoice(language: "ja-JP")
        // 読み上げ
        self.talker.speakUtterance(utterance)

        // 2回目
        utterance = AVSpeechUtterance(string: talkText2)
        utterance.voice = AVSpeechSynthesisVoice(language: "ja-JP") // defaultは英語なので毎回指定
        self.talker.speakUtterance(utterance)

        // 英語文を日本語で(読める)
        utterance = AVSpeechUtterance(string: talkTextEng)
        utterance.voice = AVSpeechSynthesisVoice(language: "ja-JP")
        self.talker.speakUtterance(utterance)

        // utterance.speechString = "こんにちわ"  // get onlyなのでテキストのみ差し替えはできない?
        // self.talker.speakUtterance(utterance)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

2017年4月5日水曜日

optionalとアンラップ

- nilを許可する場合はOptional型として "?"をつける
- 使用するときはアンラップ < "!"で強制アンラップ
  let unlap = optionalString! 
- オプショナルバインディングで安全にアンラップ
  if let opt = optionalString {   // オプショナルバインディングでfalse
      print("アンラップしました -> " + opt)
  }

// optionalとは??
var nonOptionalString:String = "hello"  // optionalじゃなくString型
print(nonOptionalString)

nonOptionalString = "hoge"
print(nonOptionalString)

// nonOptionalString = nil     // ここでエラー "nil cannot be assigned to type 'String'
// print(nonOptionalString)     // nilを入れることが出来ない為

// optional型で宣言
var optionalString:String? = "hello"    // ?をつけるとOptional型になる
print(optionalString)           // Optinal("hello")と表示される

optionalString = nil        // nil代入もOK
print(optionalString)       // "nil"と表示される

if let opt = optionalString {   // オプショナルバインディングでfalse
    print("アンラップしました -> " + opt)
} else {
    print("nilが入っている")  // こっちが表示される
}

optionalString = "hoge"
if let opt = optionalString {   // オプショナルバインディングでアンラップ
    print("アンラップしました -> " + opt)    // アンラップされたこっちが表示される
} else {
    print("nilが入っている")
}

2017年4月2日日曜日

http requestをNSURLSessionのdelegateで

NRURLSessionでhttp requestの結果をdelegateで受けてみます。

//
//  ViewController.swift
//

import UIKit

class ViewController: UIViewController, NSURLSessionDelegate, NSURLSessionDataDelegate {

    @IBOutlet weak var urlDataDisp: UITextView!
   
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
       
        getUrlData("http://tantan2014.blogspot.jp/2017/01/mapkit-viewannotation.html")
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    func getUrlData(targetUri: String){
        // 通信用のConfigを生成.
        let config: NSURLSessionConfiguration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("backgroundTask")
        // Sessionを生成.
        let session: NSURLSession = NSURLSession(configuration: config, delegate: self, delegateQueue: nil)
        // 通信先のURLを生成.
        let url: NSURL = NSURL(string: targetUri as String)!
        // タスクの生成.
        let task: NSURLSessionDataTask = session.dataTaskWithURL(url)
        // タスクの実行.
        task.resume()
    }
   
    /*
     通信が終了したときに呼び出されるデリゲート.
     */
    func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) {
        print("NSURLSessionDataTask")
       
        // 帰ってきたデータを文字列に変換.
        let getData: NSString = NSString(data: data, encoding: NSUTF8StringEncoding)!
       
        // バックグラウンドだとUIの処理が出来ないので、メインスレッドでUIの処理を行わせる.
        dispatch_async(dispatch_get_main_queue(), {
            self.urlDataDisp.text = getData as String
        })
    }
   
    /*
    
     バックグラウンドからフォアグラウンドの復帰時に呼び出されるデリゲート.
    
     */
    func URLSessionDidFinishEventsForBackgroundURLSession(session: NSURLSession) {
       
        print("URLSessionDidFinishEventsForBackgroundURLSession")
       
    }
}



ご説明はこちらが詳しいです。
http://qiita.com/aKentaKoyama/items/96a979ab3a140e7b39ec