月別アーカイブ: 2019年1月

【Swift4】UITableViewCellにUISwitchをつけたがindexPath.rowを受け取るのが大変だった件。

UITableViewは便利です。そんなに使いこなせていないけど。
Cellを自由にアレンジしたいけどわざわざクラスを作るんはめんどくさいってことで、
StoryboardでCellに直接乗せていろいろやってたんだけど、UISwitchがうまくかない。
具体的にはスイッチのイベントは受け取れるけどそれが何番目のセルがわからない。

同じ悩みが書いてあるところはいろいろと有った。
参考サイト
【今度こそ】カスタムセルに設置したUISwitchのindexPathを取得する – 技術はメシのタネ
Swift – TableViewのカスタムセルに設置したUISwitchのインデックス番号を取得する方法|teratail
iOS – TableViewに貼り付けたスイッチのインデックスを取得する方法|teratail
しかし、どうにもスマートでない感じ。

最終的に参考にさせてもらったのはこちらのサイト。
CustumTableViewCellとaccessoryViewを使ってTableVIewのレイアウトをカスタマイズ | すいすいSwift

accessoryViewを使うのがポイントでした。

インデックス番号がわからないとスチッチつける意味ないですよね。/(^o^)\
うじゃうじゃ。

【Swift4】時刻と分と曜日でアラームの日時を設定する。

アプリのアラーム関係で時刻の取扱は鬼門だ。
なかなかうまく行った試しがない。
頭の中もこんがらがりまくりだ。

ゆーてても仕方がないので先人たちの知恵とXcodeの保管機能を駆使してやってみた。

参考サイトはこちら。
UILocalNotificationでローカル通知を実装する【Swift】 | うるおいらんど
[iOS 10] User Notifications framework を使用して指定日時に発火するローカル通知を作成する #wwdc | DevelopersIO
[Swift] カレンダーや時刻のデータを扱う DateComponents – JoyPlotドキュメント
【Swift】Dateの王道 【日付】 – Qiita

時、分、曜日を指定すると次の曜日のその時刻が出てくる。
playGroundをつかってやってみた。

アラームに設定するのはまたこのあとの話…。
うじゃうじゃ。

【Swift4】【Objective-C】UNUserNotificationCenterで通知の許可をもらう。

毎度のことながら自分用の劣化コピー備忘録ブログです。

自分がメインで手を入れているアプリはObjective-Cで作って徐々にSwiftに置き換わっています。
そんな中でlocalNotificationがiOS10以降でdepricatedになりUNUserNotificationCenterを推奨されたので調べてみました。

参考サイト
Xcode|iOS10で新しくなったUNUserNotificationCenterの使い方を調べてみた
ローカルプッシュ通知(iOS10以降) – Qiita
[iOS 10] User Notifications framework を使用してリモート通知を受け取る処理を実装する #wwdc | DevelopersIO

まずUNUserNotificationCenterを使う前提としてUserNotifications.frameworkが必要です。
入れておきましょう。
【Swift4】【Objective C】UNUserNotificationCenterで通知の許可をもらう。

とりあえず未だ、AppDelegateはObjective-CなんでObjective-Cで書きます。
まずはUserNotificationをインポートしてデリゲートをセットします。

次にUNUserNotificationCenterのユーザーに対する許諾をもらう部分です。

以上でアプリがバックグランドの時はローカル通知を受けれますが、フォアグラウンドでも通知が受けれるようにするには下記のメソッドを追加します。

viewControllerはほぼSwiftに置き換わってるのでObjective-Cでのテストはしていません。
以下は参考サイトからのコピペですすみません。
多分動くと思います。(-人-)

追記。
swiftで通知の許可を貰う場合。
参考サイト
<Swift>iOS 10 User Notifications Framework実装まとめ – Qiita

UserNotifications.frameworkを入れるのは上記と同じ。

で、インポートします。

didFinishLaunchingWithOptionsで許可を求めます。

フォアグラウンドでの通知の受け取りは以下のMethodを実装。

テスト用に5秒で鳴る通知。

上記をviewWillApperあたりに入れると、開くたびに5秒後に鳴るテストが出来ます。\(^o^)/

【Kotlin】R.layout.activity_mainでunresolved referenceというエラー?

Kotlinに手を出しました。\(^o^)/
未だにSwiftもまともに使えてないですが、Androidアプリも作りたいなーってことでボチボチと勉強を始めます。

とりあえず本を一冊買ってきて写経から始めます。(-人-)
買った本はこちら。

【Kotlin】R.layout.activity mainでunresolved referenceというエラー?

はじめてのAndroidプログラミング 第3版 [ 金田 浩明 ]
価格:2862円(税込、送料無料) (2019/1/13時点)

Android Studioのインストールから初期設定まで良い感じです。
Android StudioはXcodeとはやはり使い勝手がちがって戸惑うところも多いですね。

インストールから、HelloWorldを終わっていよいよ簡単なアプリを作っていくところで本に出てないエラーで引っかかりました。
じゃんけんアプリを作っていて、画像を配置し終わって、コードを書くところです。
上記の本を持ってる人だったら、127ページ辺りです。

コードのViewという部分が赤くなって、android.view.Viewが自動インポートに失敗している場合というのは本に対応策が載っていて対処できたのですが、その上の、R.layout.activity_main のRが赤い字になっていて何らかのエラーを起こしているようでそこで数時間悩んでしまったのでその備忘録です。
こんな感じ。
【Kotlin】R.layout.activity mainでunresolved referenceというエラー?

ぐぐってみるとR.javaがないって事らしい。
でもそれは自動インポートされるもので手動で入れるものでもないらしい。
XMLが間違ってるとR.javaはインポートされないとかなんとか。
MainActivity.ktのコードを書いていてのエラーなので、activity_main.xmlをひらいてテキスト表示でコードで見てもエラーはない。

でいろいろと良く見て調べていくと、activity_main.xmlではなく、activity_result.xmlの方でエラーが見つかった。
【Kotlin】R.layout.activity mainでunresolved referenceというエラー?

画像ボタンの幅や高さの数値の単位を付けていないことが原因らしい。
そのくらい自動で直してくれよと思わんでもないが、そういう仕様ならば仕方がない。
数値にdpをつけて修正。

BuildからClean Projectを選ぶとエラーが無くなった。
【Kotlin】R.layout.activity mainでunresolved referenceというエラー?

Xcodeとはいろいろとお作法が違うので大変だが、それもまた楽し!ということにしておこう。

【Swift4】縦長のスクロール画面をscrollViewとstackViewを使って作ると便利だった。

設定画面とか縦長でスクロールする画面を作りたい時ってあるじゃないですか。
でもテーブルビュー使うのめんどくさいな、みたいな。
そんなときに便利なやり方です。

一応の完成形はこんな感じ。
【Swift4】縦長のスクロール画面をscrollViewとstackViewを使って作ると便利だった。

参考サイト
制約の修正なしで縦方向に要素を追加可能なビューの作成 – Qiita
【iOS】ちょっと待って!その画面UITableViewで作る必要ないかも – ペンギン村 Tech Blog
【UIScrollView】Autolayoutで縦スクロール【Xcode8.x】 – Qiita

ではまず、Safe AreaにScroll Viewを配置します。
Add New Constraintsで上下左右全てのマージンを0とします。
【Swift4】縦長のスクロール画面をscrollViewとstackViewを使って作ると便利だった。

次いで、その中にVertical Stack Viewを配置し、Scroll Viewと同様に、Add New Constraintsで上下左右全てのマージンを0とします。
【Swift4】縦長のスクロール画面をscrollViewとstackViewを使って作ると便利だった。

このままではScroll Viewのコンテントサイズの制約がないためエラーがでます。
【Swift4】縦長のスクロール画面をscrollViewとstackViewを使って作ると便利だった。

マウスの右ボタンでStack ViewからScroll ViewへドラッグしてEqual Widthで横幅を揃える制限をつけます。
【Swift4】縦長のスクロール画面をscrollViewとstackViewを使って作ると便利だった。

Stack Viewの子コンテンツでScroll Viewの高さが決まります。
とりあえずStack ViewのDistributionをEqual SpacingにしてSpacingを0にします。
【Swift4】縦長のスクロール画面をscrollViewとstackViewを使って作ると便利だった。

子コンテンツを入れて高さが決まるとScroll Viewの高さが決まります。
【Swift4】縦長のスクロール画面をscrollViewとstackViewを使って作ると便利だった。

2019年1月22日追記〜〜
このままだと上下の高さがSafe Areaの分ずれるので、Scroll Viewの上下の対象をSafe AreaからSuperviewに変えます。
【Swift4】縦長のスクロール画面をscrollViewとstackViewを使って作ると便利だった。
↓対象をSuperviewに変えて
【Swift4】縦長のスクロール画面をscrollViewとstackViewを使って作ると便利だった。
↓マージンを0にします。
【Swift4】縦長のスクロール画面をscrollViewとstackViewを使って作ると便利だった。
↓上も下もね。
【Swift4】縦長のスクロール画面をscrollViewとstackViewを使って作ると便利だった。
これで上下のズレがなくなります。
追記終わり〜〜
 
 

さて、ここから縦長な画面にします。
操作するViewを選んで、simulated sizeを「freeform」にして、heightを設定します。
とりあえず1200にしてみました。
【Swift4】縦長のスクロール画面をscrollViewとstackViewを使って作ると便利だった。

StackViewに高さが200の子Viewを6個入れて分かりやすように色を付けてみました。
【Swift4】縦長のスクロール画面をscrollViewとstackViewを使って作ると便利だった。

これでアプリを起動すると綺麗にスクロールしました。\(^o^)/
【Swift4】縦長のスクロール画面をscrollViewとstackViewを使って作ると便利だった。

これだけのことがコードを一行も書かずにできるってすごいなーと思います。\(^o^)/

【Swift4】NSDictionaryを要素に持つNSMutableArrayをDictionaryのKey順にソート

自分は独学でiPhoneアプリを作っています。
初心者向けのSwiftの本を数冊とあとはインターネットで検索して調べています。
C言語の基礎知識とかはまったくないです。英語のApple Developerなんちゃらを読んでもさっぱり理解できません。
しかし、やりたいことが決まって大体のやりかたはネットで調べれば基本的なことはたいてい出てきますが、
たまにこの人どーやって調べてこのやり方にたどり着いたんだろうと思うことがたまにあります。
今回もそんな感じです。
そして自分はすぐに忘れてしまうし、先人のブログが消えるとわからなくなるのでここに劣化コピーを載せています。

今回は、配列に入ったディクショナリをその要素でソートしたかったんですが、なかなかやり方が分からず難儀しました。
今回の参考サイトはこちら。
[swift] NSDictionaryを要素に持つNSArray/NSMutableArrayをKey順にソート | BlueBear I/O

適当に調べながらプレイグラウンドでコードを書いたので冗長だったりするかも。
サンプルコード

ほんとこーゆーのってどうやってしらべてるんだろう?
とりあえずなんとかなってよかった。
うじゃうじゃ。