iOS チュートリアルが一通り終わったので、Slack に投稿するアプリを作ってみることにしました。
レポジトリは以下。
元々 Android 版をシュッと作っていたので、iOS 版という位置づけでやってみます。
アプリの機能は非常に単純で、webhook の URL を入力し、ユーザー名、アイコン、文字列を指定して OK を押すと JSON を webhook サーバーに POST するというものです。
続きを読む今回は画面遷移の実装、データの編集、データの永続化あたりです。
Intent
は Segue
と言うらしい。
Segue
にもいろんな種類の遷移があって、それぞれアニメーション等が微妙に違う。こういうのが apple っぽくて良いですね。NavigationController
は Activity
みたいなもので、 ViewController
は Fragment
みたいなものだというざっくりした認識を得た。Push Segue
と Modal Segue
というのがある。
NavigationController
も入れ替わるが、前者ではそんなことない。prepareForSegue
は自分から離れるときに呼ばれる。
ViewController
が降ってくるので、そこのメンバ変数に入れたいものを突っ込む…らしいIntent
に一旦突っ込むので直接入れるのは意外だったViewController
が降ってくるのでそこからデータを受け取るとのこと。メソッド一つ設定するだけでいい感じの編集UIができあがる。
編集UI、横スクロールした時に View
がはみ出していてつらい気持ちになった。
厳しい雰囲気 pic.twitter.com/u2AU7UKMDD
— のにれん(うにゃ)) (@nonylene) February 29, 2016
iPhone6S だったらならなかった。あまり横幅を広くするなということだろうか。
Android よりも楽にモデルごと保存できるようでよかった。この程度になると Android では SQLite 使わないといけなさそう?
こうして公式チュートリアルは終わりました。あとは自分で軽いアプリを作ってみたいと思います。
一日目
1日目の記事はこちらです。
さて今日は二日目です。果たしてサークルの合宿に間に合うのか…
今日はモデルを定義して TableView
を作成しました。
Androidでいう ListView
と RecyclerView
の中間っぽい。
ListView
という感じ。。iOS はこんなに簡単に ListView
が作れるの最高ですね…!
でも RecyclerView
のほうが型的には安心だという気がした。
tableView.dequeueReusableCellWithIdentifier("MealTableViewCell", forIndexPath: indexPath) as! MealTableViewCell
ってなんだよ…そこクラス入れていい感じに型安全にできるじゃん…!って思ってしまう。
とにかく文字列で指定という感じ、obj-C の遺産だったりするんだろうか。
ViewController
のクラスを指定するときに存在しないクラスを指定してもビルドできちゃうんですね
StoryBoard
上でパーツ削除した時、コードから消すのは手でチマチマやるのは少しつらい。
StoryBoard
に存在しないのにビルド通るのか。最高だけど UI 周り案外いろいろだるいのでは、と思った日でした。
こんにちは。最近 build.gradle
をゴニョゴニョするのに慣れてきました。
ここ数日、 PhotoLinkViewer をモジュール分けしたいなーと思って一部分を切り離しました。
切り離したものは他のアプリでも使いたいので、プロジェクトとして独立させることにしています。
ここで切り離し元から参照するには 2つほど方法があり、
submodule
などでプロジェクト直下等に置いて管理する
aar
化してレポジトリに置き、 build.gradle
の dependencies
に組み込む。
という感じです。
submodule で管理する方法を使えば ManifestMerger
が AndroidManifest
をよしなにマージしてくれるので、切り離し元の AndroidManifest
に Activity の情報を書く必要がありません。
marshmallow のつづりが未だに覚えられないです。
原因わかったので追記しました。
さて、自分の作っている PhotoLinkViewer には「他のブラウザで開く」機能があります。例えば画像の開くアプリで PhotoLinkViewer をデフォルトのアプリに指定していて、その後画像だけではなくウェブサイトが見たくなった時などに重宝します。
これはどのように実現しているかというと、
startActivity(Intent.createChooser(new Intent(Intent.ACTION_VIEW, uri), getString(R.string.intent_title)))
として行っています。 createChooser
を用いることでこのアプリをデフォルト設定している時でもアプリ選択画面が現れるようにしています。
しかし、この機能が Andorid 6.0 からうまく動かなくなってしまい、デフォルト設定していればまた PhotoLinkViewer が立ち上がってしまうようになりました。
続きを読む最近体調が悪いです。
さて、今回は自宅の Raspberry pi に GitLab を導入した話です。
GitLab とは、GitLab Inc. が開発しているサービスで、GitHub のクローン的なやつです。といってもインターフェースまでそっくりというわけではないですし、GitLab 独自の機能もあります。
昔は気持ち悪い生き物のアイコンで有名だったのですが、最近ロゴが変わってスッキリしました。
GitLab は自分のサーバーに設置することができ、さらにオープンソースの "Community Edition" なら無料です。無料でも十分な機能が使えそうでした。
僕は書いたコードは GitHub で大抵オープンソースにしているのですが、レポートを tex で書いているのをオープンにするわけにもいかないので private repository にしようかなあと迷っていました*1。
実際 private repository でもよかったのですが、 .xlsx とか .numbers 的なファイルもそこそこあったので外部に上げるのになんとなく抵抗があり*2、GitLab で管理することにしました。元々興味もあったし。
*1:元々は Raspberry pi のあるディレクトリ上にレポジトリを作っていたのですが、webから気軽に見れないのが不便だなあと感じたので
*2:でかいバイナリや、どんな情報あるかわからない xlsx をGitHubにアップロードするのがなんとなく好まなかった