しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

UITableViewCellEditingStyleでnoneを選んだ時にできる空白スペースを削除する

UITableViewCellで、削除ボタンを出さなくした時のスペースを消す方法です。

内容

UITableViewでは以下のようなメソッドを実装する事で編集中に削除ボタンを出さない事ができます。

override func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
    return .none
}

しかし消すだけだと左側にスペースが残ってしまいます。

f:id:llcc:20160924131603p:plain

shouldIndentWhileEditingRowAtを実装する事でスペースを消す事ができます。

override func tableView(_ tableView: UITableView, shouldIndentWhileEditingRowAt indexPath: IndexPath) -> Bool {
    return false
}

f:id:llcc:20160924131742p:plain

【In-App Purchase】iOSでInvalid Product Identifierが出た時の対処法

アプリ内課金でアイテム情報が取得できなかった時の対処法です。

今回のケースでは、iTunesconnectの「契約/税金/口座情報」を入力する事で解決しました。 入力後30分くらい経ったらプロダクト情報が取れるようになりました。

シンプルなRESTClient、insomniaを試してみる

insomniaというRESTClientを試してみました。

insomnia.rest

アプリはこちらのページからダウンロードしました。

insomnia.rest

起動後画面は下のようなものです。

f:id:llcc:20160921234259p:plain

このようにURL指定でリクエストを送る事ができます。

f:id:llcc:20160921234305p:plain

ベーシック認証・ヘッダー・パラメータなどを自由に付けれるようです。

f:id:llcc:20160921234311p:plain

作成したリクエストは保存する事もできます。

f:id:llcc:20160921234314p:plain

【Swift】呼び出し元のメソッド名を取得する

メソッドの呼び出し元を取得する方法を調べました。

良くある方法はスタックトレースを見る方法です。

class MyClass {
    func originMethod() {
        targetMethod()
    }
    
    func targetMethod() {
        let symbols = NSThread.callStackSymbols()
        print(symbols.count >= 2 ? symbols[1] : "")
    }
}

以下のような形式で出力されるので少し加工が必要です。

1   MyApp                               0x000000010be1f242 _TFC5MyApp7MyClass12originMethodfT_T_ + 18

他にもデフォルト引数で#functionを受け取る方法もあります。

class MyClass {
    func originMethod() {
        targetMethod()
    }
    
    func targetMethod(originMethodName: String = #function) {
        print(originMethodName)
    }
}

こちらだとメソッド名がしっかり出てくれるので扱いやすいです。

targetMethod

参考URL

【Swift】メソッドがどこから呼ばれているかを知るTips - debug identifiers - - Qiita

自作のCocoaPodsライブラリのバージョンを上げる

自作のCocoaPodsライブラリのバージョンを上げる方法です。

まずはpodspecファイルのバージョンを更新します。

Pod::Spec.new do |s|
  s.version = "0.1.4" # ここのバージョンを変える
end

次はそのバージョンのタグを作ってpushします。

git tag 0.1.4
git push --tags

最後にpodコマンドでライブラリの更新をします。

pod trunk push

DIコンテナとは何かを調べてみた

DIコンテナとは何か調べてみました。
サンプルはSwiftで書かれています。

DIとは

DIとはDependency injectionの略で、デザインパターンの一種です。
日本語では言うと依存性の注入などと呼ばれる事が多いです。
このデザインパターンは複数の関連するオブジェクトの結合を疎にする為のものです。

例えば以下のようにOwnerはDogクラスに紐付いているとします。
もしこのコードで、OwnerにDogのサブクラスを渡したいと言われたりDogのプロパティーを変更したいと言われると都度Ownerを変更する必要があります。
そうなるとOwnerが多くの場所で使われている場合にテストが大変ですし、柔軟性にも欠けます。

class Owner {
    func exec() {
        Dog().howl()
    }
}

class Dog {
    func howl() {
        print("wan!")
    }
}

Owner().exec()

それをDIを使って変更してみます。
DIを使うと以下のようになります。
Dogをコンストラクタで外部から渡す事で柔軟なクラスになりました。

class Owner {
    let dog: Dog
    
    init(dog: Dog) {
        self.dog = dog
    }
    
    func exec() {
        dog.howl()
    }
}

class Dog {
    func howl() {
        print("wan!")
    }
}

Owner(dog: Dog()).exec()

DIコンテナとは

DIコンテナとはDIを実現できるフレームワークの事を指します。
JavaSpring Frameworkなどが有名です。

参考URL

仕事に役立つプログラミング・キーワード - DIコンテナ【Dependency Injection Container】:ITpro
依存性の注入 - Wikipedia