Swift UIKit Localization

Menu > File > New > File…から、次のようにStrings Fileを選択し、プロジェクトに追加する。この時のファイル名は、”Localizable.strings” とする。ファイル名の先頭は、必ず大文字Lにする。そうしないと、Localizeされない。

“Localizable.strings” ファイルのコンテクストメニューから、”Show File Inspector” を選択し、English と Japanese を追加する。(下図参照)

コードでローカライズする場合は、次の通り。

storyboardをローカライズする場合は、PROJECT > Info > Localizations から、English, Japanese を追加する(下図参照)。

この時、”Interface Builder Storyboard” を選択する。そうすると、Interface Builderで、ローカライズ画面をデザインできる。

シミュレータのロケールは、Menu > Product > Scheme > Edit Schemeから、Application Language で選択する(下図参照)。

Failed to instantiate the default view controller エラー

次のようなエラーが発生した場合、View Controller の “Is Initial View Controller” のチェックが外れており、最初にキックされる View Controller が存在していないか、確認する。Initial View Controllerがないと、アプリの起動画面が真っ黒になり、何も表示されない。

[WindowScene] … Failed to instantiate the default view controller for UIMainStoryboardFile ‘Main’ – perhaps the designated entry point is not set? for UIMainStoryboardFile ‘Main’ – perhaps the designated entry point is not set?

および、Build Settings > Packaging > Info.plist File のパスを変更

xcode でプロジェクトをコピーして、リネームした場合のエラー対応

xcode でプロジェクトをコピーして、リネームした場合、次のエラーが発生した。

Build input file cannot be found: パス名/Info.plist

対応としては、プロジェクト > General > Identity > Choose Info.plist File から、Info.plist を選択し、再ビルドする。

UIPickerView

Tap, LongPress

viewDidLoadで通知設定を行い、ViewController を繰り返し使用する場合、通知が複数回登録されてしまう。
この場合、
override func viewDidDisappear(_ animated: Bool) で、次のように通知を削除する。
        NotificationCenter.default.removeObserver(self)

AlertController

mac / swiftでは、 “\” ≠ ”¥”

.NET/C# では、バックスラッシュ “\” は、エンマーク”¥”で表示され、同じ意味ですが、mac / swift では、別物として扱われる。

例えば、
label.text = “\(sender.selectedSegmentIndex)” では、sender.selectedSegmentIndex が正しく評価されるが、
label.text = “¥(sender.selectedSegmentIndex)” では、
sender.selectedSegmentIndex が評価されず、文字列として扱われる。

\ の入力方法は、option キー + “¥”キー

AVPlayerViewController をコントローラとして、ビデオをリピート再生。

Swift でアナログクロックを作ってみた

.NET/C# からすると、全体の設計が違っているので、とても戸惑いました。最初は、UIViewに直接描画するのかと思いましたが、秒、分、時それぞれごとにCAShapeLayer に時計の針を描画して、レイヤーの原点を translateしてセンタリングして、さらに時間に合わせて rotate し、で重ね合わせる方法が良さそうです。秒針をスムースに動かすのであれば、Animation を適用すればOK。1