iOS開発メモ

### ローカライゼーション
https://medium.com/@mizutory/ios-localization-チュートリアル-38b0eefd2dc0#.o7lppb85l

### Asset Catalog
コードで呼び出すときは、画像の名前ではなく、Asset Catalogに設定した名前を呼び出すことに注意。つまり使用前にAsset Catalogで名前を設定しておく必要がある。
http://www.sirochro.com/note/xcode-about-asset-catalog/

### 角丸
http://chicketen.blog.jp/archives/4907195.html

### Aspect Fitについて
http://hiramatch.hatenablog.com/entry/2015/03/08/214128

### ランダムな値を生成する
int min = 1;
    int max = 5;
    int rNumber = arc4random_uniform(max + 1 - min) + min;
http://qiita.com/tomoyuki_okawa/items/5f0ce5146a07ab81da30

### 整数から文字列
int x = 100;
NSString *str = [NSString stringWithFormat:@"%d", x];
http://d.hatena.ne.jp/ugon105/20100905/1283708178

### Alert Viewを呼ぶ
http://nlogic.jp/?p=261

### WKWebView
http://log.whitebook.info/swift/2014/11/swift-wkwebview-1.html
http://dev.classmethod.jp/references/ios8-webkit-wkwebview-1/

### WebViewの左右をマージン無くする
http://chitan.hateblo.jp/entry/2014/12/14/224937

### WKWebView/UIWebViewでNavigation Barの下にウェブページが隠れるのを回避
http://easyramble.com/show-webview-out-of-navigation-bar.html
### WebViewでhttp通信を可能にする設定（ATS対応）
http://dev.classmethod.jp/smartphone/ats-in-ios-10/
### [iOS 8] WKWebView で Web ページのロード中にステータスバーにインジケーターを表示してみる 〜 Objective-C 編
http://dev.classmethod.jp/references/ios8-webkit-indicator/

### WKWebViewのデリゲートメソッドについて
http://qiita.com/sgt/items/6811ed083be35f83e86a

### Xcodeの余計なログを表示しなくする方法
http://galakutaapp.blogspot.jp/2016/09/xcode8ios10.html

### 無線通信可能かどうか調べる（Reachability使用）
http://dogandrun.hatenablog.jp/entry/2014/07/07/001049

### self.propertyと_propertyの違いと、使い分け方
http://qiita.com/weed/items/2736582eeb404cb2c1e6

### 入力フィールドのエリアが空の場合、エンターキーは非活性にする方法
storyboardから設定する場合は、「Auto-enable Return Key」にチェックを入れる。<br>
![スクリーンショット 2017-03-22 10.23.56.png](https://qiita-image-store.s3.amazonaws.com/0/162670/64b5a757-5ff1-2c88-b7e0-45431deaecb0.png)

コードから設定する場合は、`textfield.enablesReturnKeyAutomatically = YES;`とする。

### TextFieldでの文字の入力数の最大長を制限する
https://www.tamurasouko.com/?p=940

### 背景をタップすると、キーボードを非表示にする。	

```swift:
//ViewController.swift

    //TextFiledをstoryboardからつなげておく
    @IBOutlet weak var textField: UITextField!

    //MARK: キーボードが出ている状態で、キーボード以外をタップしたらキーボードを閉じる
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        //非表示にする。
        if(textField.isFirstResponder()){
            textField.resignFirstResponder()
        }

    }
```
http://mzgkworks.hateblo.jp/entry/uitextfield-keyboard-control

### (objc)現在時刻を取得する
http://age-d.com/alog/2012/07/ios-tips-nsdate/

### 日本語の曜日を取得する
「月」とか「火」とかの文字列が取得出来ます。
http://qiita.com/katsuhisaishii/items/5626fac9a2d5e6cb4792
その他時間を扱うトピックについては次が詳しい。
http://dev.classmethod.jp/smartphone/ios-nsdate/

### Cocoapods導入
http://qiita.com/ShinokiRyosei/items/3090290cb72434852460

### クラス名を文字列として取得する
例として、`MyClass`型のクラス名を取得する。

```
// MyClassクラスを定義
class MyClass {
}
let typeString = String(describing: MyClass.self)    //"MyClass"
```

### Xib/NibファイルからUIパーツを初期化する
#### UITableViewCell
```
let nib = UINib(nibName: String(describing: MonthViewCell.self), bundle: nil)
guard let monthViewCell = nib.instantiate(withOwner: nil, options: nil).first as? MonthViewCell else {
  fatalError()
}
```
参考：http://himaratsu.hatenablog.com/entry/ios/customview

#### UIViewController
Xibファイルから初期化して`NavigationController`からプッシュして表示する

```
let areaVC = AreaVC.init(nibName: String(describing: AreaVC.self), bundle: nil)
areaVC.areaInfo = areaInfo
self.navigationController?.pushViewController(areaVC, animated: true)
```

### navigation bar で戻ってきた時に、tableViewの選択を解除

```
override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    if let indexPathForSelectedRow = prefTableView.indexPathForSelectedRow{
     prefTableView.deselectRow(at: indexPathForSelectedRow, animated: true)
    }
}
```

参考：[UITableViewのUX改善(今すぐ出来る！)](https://qiita.com/AcaiBowl/items/8f71ca67da4c6f4b78d2)

### URLSession使用時に通信をキャンセルしたい
URLSessionDataTask等Task単位でキャンセルしたい場合、`task.cancel()`でOK.

URLSessionごとキャンセルしたい場合、`session.invalidateAndCancel()`を呼ぶ。この時sessionインスタンスは無効化されるため、新しくインスタンスを生成する必要がある。
ただし、`URLSession.shared`に対してinvalidateAndCancel()しても何も起こらない。

https://developer.apple.com/documentation/foundation/urlsession/1411538-invalidateandcancel

#### 例

```
//タスクを生成して実行
let task = session.dataTask(with: urlRequest,
                                    completionHandler: {data,response,error in
     (中略)
 })

task.resume()

//セッションを無効化してタスクをキャンセル
session.invalidateAndCancel()
session = {
   let configuration = URLSessionConfiguration.default
   let session = URLSession(configuration: configuration)
   return session
  }()
```

URLSessionクラスには、`reset(completionHandler:)`なるメソッドもある。しかしこのメソッドでは`dataTask(with:completionHandler:)`メソッドが生成するタスクはキャンセルされなかった。