使って創ってApp

ソフトウェアを使ったり作ったりするブログです

UITextFieldのカーソルの色を変更する

UITextField のカーソルの色を変更する方法です。こちらを参考にしました。

qiita.com

 開発環境

カーソルの色を変更する

UITextField の tintColor プロパティを変えると、カーソルの色が変わります。 tintColor プロパティは、Interface Builder でもコードからでも変更することができます。

変更前

f:id:hitxutokun:20151231231107p:plain

変更後
textField.tintColor = UIColor.whiteColor()

f:id:hitxutokun:20151231231254p:plain

おわりに

tintColor は UIView クラスで定義されています。説明はこう書いてありました。

The first nondefault tint color value in the view’s hierarchy, ascending from and starting with the view itself.

UIView Class Reference より引用

UIView クラスを継承しているクラスでこのプロパティが使えます。しかし、そのクラスの色が変わる具体的な部位が書いてあるわけではないので、「自分で想像してね」ということなのでしょうか?今度調べます。

NavigationControllerで移動する一つ前のViewControllerを取得する iOSアプリ開発

iOSアプリ開発で NavigationController を使っている際、移動前の ViewController を取得したかったのでドキュメントを少し眺めてみました。

developer.apple.com

移動前の ViewController の取得方法は UINavigationController Class Reference に書いてありましたので備忘録として残しておきます。

開発環境

NavigationControllerで移動する一つ前のViewControllerを取得する

UINavigationController に属する ViewController 達は、画面を移動して表示される度に NavigationController が持つ配列に後入れで格納されます。それでは一つ前の ViewController を取得する方法を紹介します。

まず、自身(ViewController のサブクラス)を保有する NavigationController を呼び出します。その中には移動前の全ての ViewController が収められている ViewContllers 配列があります。その配列の後ろから二番目に、移動前の ViewController があります。

UINavigationViewController の ViewController のリファレンスには以下のように書いてありました。

The root view controller is at index 0 in the array, the back view controller is at index n-2, and the top controller is at index n-1, where n is the number of items in the array.

UINavigationController Class Reference より引用

簡単に書くと、コードは以下のようになります。

let navc = self.navigationController!
let viewc = navc.viewControllers[navc.viewControllers.count - 2]

UITextField内の文字が変更される度に関数を呼び出す

iOSアプリ開発で、UITextField 内の文字が変更される度に関数を呼び出すことをできるようにします。そのためには NSNotificationCenter クラスを使います。

開発環境

完成予定図

TextFieldないの文字が変わる度に、コンソールに文字を出力します。

f:id:hitxutokun:20151229235456g:plain

UITextField 内の文字が変更されたことを知るために

UITextField 内の文字が変わったらこの関数を実行してくれと、NSNotificationCenter クラスにお願いをします。以下のコードを ViewWillAppear メソッド内に書きます。

// ViewWillAppear メソッド
NSNotificationCenter.defaultCenter().addObserver( self,
  selector: Selector("何らかの関数:"),
  name: UITextFieldTextDidChangeNotification,
  object: nil
)

何らかの関数に、コンソールに「変わったよ」と表示する関数を指定してみます。

// Selector("何らかの関数:") を Selector("textFieldDidChange:")に変更
func textFieldDidChange(aNotification: NSNotification) {
  print("変わったよ")
}

View に UITextField を乗っけただけのアプリで動作確認をしてみます。

f:id:hitxutokun:20151229235456g:plain

これで完了です!

おわりに

今回は addObserver の name 引数に UITextFieldTextDidChangeNotification を指定しましたが、他にもこのような定数が沢山用意されています。例えば、「キーボードが表示されるよ」を表す UIKeyboardDidShowNotification があります。これらは各クラスのリファレンスの下部に Notifications としてまとめられています。

Swiftで数字のみ含まれる文字列か判定する

テキストフィールドに入力された文字列が、数字のみで構成されているか判定したかったので、Swift での文字列検索を調べてみました。ドキュメントを読んだところ、「単純に検索したいなら NSPredicate を使うといいよ。」と書いてあったのでやってみました。

参考サイト

developer.apple.com

開発環境

数字のみで構成されている文字列か判定する

NSPredicate クラスで正規表現を使って判定します。 NSPredicate のインスタンスを作成するコードです。

let predicate = NSPredicate(format: "SELF MATCHES '\\\\d+'")

NSPredicate は検索や比較などの条件を文字列で指定して使うクラスです。文字列を使わないで検索条件を書くこともできます。MATCHES を書くと、正規表現で比較できるようになります。\\\\d+ は「一文字以上の 0 ~ 9 の文字列が続く」という意味を表しています。

この検索条件を実行してみましょう

let predicate = NSPredicate(format: "SELF MATCHES '\\\\d+'")
predicate.evaluteWithObject("123456789") // true
predicate.evaluteWithObject("1234y6789") // false

predicate を evaluteWithObject メソッドで実行しています。実行結果は Bool が返ります。

おわりに

今回のように、ある文字列が含まれているかを判定するにはいい方法だと思います。NSRegularExpression クラスを使用するよりは、単純なコードになるのではないでしょうか。

UITableViewのCellを選択不可にする

iOSアプリ開発で、UITableView の Cell を選択させない方法を調べたので、メモします。

開発環境

TableView にある全ての Cell を選択不可にする

TableView の Selection プロパティを設定します。

  1. Storyboard や xib ファイルで TableView を選択して、Attributes Inspector を開く
  2. Selection プロパティを No Selection に設定

    f:id:hitxutokun:20151227214255p:plain

TableView にある特定の Cell を選択不可にする

プログラムで指定します。

// UITableViewCell のインスタンス cell をすでに作成してるとして
cell.selectionStyle = UITableViewCellSelectionStyle.None

また、Prototype Cell や Static Cells のテーブルなら、Attributes Inspector からでも設定できます。Selection プロパティを None に設定します。

f:id:hitxutokun:20151227215418p:plain

まとめ

TableView の Cell を選択不可にするには2通りの方法がある。

  • UITableView の Selection プロパティを No Selection に設定する
  • UITableViewCell の Selection プロパティを None に設定する

余談

iOSアプリ開発中に UITableView の Cell が選択不可になったため、この件を調べました。これらのプロパティはもちろん設定していませんし、UITableView の delegate, datasource はちゃんと設定してありました。その TableView を削除して作り直しても駄目で、Storyboard のソースも調べてみましたが原因は解りませんでした。結局プロジェクトごと作り直しました。

まぁ、自主的に Cell を選択不可にする方法がわかったので良しとします。原因はまた今度探ってみます。

iOSアプリ開発でナビゲーションバーの色を変更する

iOSアプリ開発でナビゲーションバーの色を変更したかったので調べました。下記のサイトを参考にしました。

qiita.com

開発環境

ナビゲーションバーの色を変更する

AppDelegate の  application メソッドに下記のコードを入力します。

UINavigationBar.appearance().barTintColor = UIColor(red: 205/255, green: 55/255, blue: 55/255, alpha: 1.0)

f:id:hitxutokun:20151226215242p:plain

ナビゲーションバーのボタンとタイトルの色を変更する

AppDelegate の  application メソッドに下記のコードを追加します。

// タイトルの色を変更
UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()]
// ボタンなどの色を変更 UINavigationBar.appearance().tintColor = UIColor.whiteColor()

 

f:id:hitxutokun:20151226220145p:plain

iPhoneかiPadかを判定する iOSアプリ開発

iOSアプリ開発で、現在使用しているデバイスが iPhoneiPad なのかを判定します。

開発環境

判定方法

現在使用しているデバイスの情報を取得するには、UIDevice クラスを使います。UIDevice クラスのドキュメントを見てみると、このクラスには userInterfaceIdiom プロパティと UIUserInterfaceIdiom enum が定義されています。説明を読んでみるとそれっぽいことが書かれているので、この二つを使います。

userInterfaceIdiom
For universal applications, you can use this property to tailor the behavior of your application for a specific type of device.
UIUserInterfaceIdiom
The type of interface that should be used on the current device.

UIDevice Class Reference より

判定方法のコード

使用しているデバイスが iPad かを判定するコードです。

if UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Pad {
 // some code here
}