TOKOROM BLOG

iOSとかVimとかその他日々の雑多な技術情報

Storyboardでの画面遷移をスマートにやる方法 はてなブックマーク - Storyboardでの画面遷移をスマートにやる方法

Permalink

これは potatotips第6回め で発表した この話 のまとめと後書きです。

Storyboardいいですよね!

Storyboardを使うことで、

  • 画面と画面が疎結合になる
  • 簡単な画面遷移ならノンコーディングで実現できてソースコードを汚さない

といったメリットがあります。

Storyboard登場以前だと、次の画面に遷移させるだけでも

1
2
3
4
#import "NextViewController.h"

NextViewController *nextViewController = [NextViewController new];
[self.navigationController pushViewController:nextViewController animated:YES];

といったコーディングをし、遷移元のViewControlelrは遷移先のViewControllerに依存する(importしないといけない)形でした。

しかし、Storyboardを活用することで画面遷移のために画面同士が密結合になることを避けることができるようになりました。

ただしStoryboardを使って今まで以上に悪くなるパターンがある

とはいえ、Storyboardも完璧ではなく、画面遷移時に次の画面になにか値を渡したいときにはこんな実装をする必要があります。

Xcodeのプロジェクトファイル(pbxproj)がコンフリクトしまくるのをなんとかしたい! はてなブックマーク - Xcodeのプロジェクトファイル(pbxproj)がコンフリクトしまくるのをなんとかしたい!

Permalink

2014/02/09 追記
コメントのところでやり取りしているようにmergepbxの作者さんから連絡があって、この記事で書いた問題が修正されました!
今現在は merge=mergepbx がいい感じになってきているのでそっちがオススメです。

複数人でプログラミングしているとpbxprojがやたらとコンフリクトする

例えば、

  • Aさんが AALabel.m をプロジェクトに追加して
  • Bさんが BBLabel.m をプロジェクトに追加して

とただそれだけなのにマージのときにコンフリクトするpbxprojさん。。。

ただそれぞれファイルを追加だけのことでコンフリクトするなんて…
どうにかならんもんかいとTwitterでつぶやいたところ、 @azu_re さんから有り難い教えが!

提供するXXXViewControllerの親クラスを差し替え可能にしたい! はてなブックマーク - 提供するXXXViewControllerの親クラスを差し替え可能にしたい!

Permalink

XXXViewControllerの親クラスを差し替えたいときありますよね?

UIKit内で言えばUITableViewControllerとかはその代表格。
外部ライブラリで言うと、Google Analytics SDKのGAITrackedViewControllerとか。

要するに、XXXViewControllerの継承して実現したい機能があるのに、既にYYYViewControllerのサブクラスなので使えないよーとなってしまうケース。

で、既存のものは置いておくとしても、自分が作るライブラリのXXXViewControllerについては、なんとかその親クラス差し替えの需要に応えられないものかなあと。

runtime使う?

いちおう class_setSuperclassという関数があるのですがDeprecated… なんか良い方法ないかな?と考えた結果、今のところ以下のかんじに落ち着きました。

会社でiOSアプリを扱うときのアカウント管理はこうするべきだった? はてなブックマーク - 会社でiOSアプリを扱うときのアカウント管理はこうするべきだった?

Permalink

2013年11月18日 追記

この記事を書いた後、何人かのかたから「うちでは同じApple IDで両方とも使えているよ」というご指摘をいただき、

  • Member Centerのほうにアカウント追加 -> iTunes Connectに同じアカウント追加という順番だと「警告は出るもののかまわずContinueすれば」同じApple IDでアカウント作成可能
  • iTunes Connectにアカウント追加 -> Member Centerに同じ追加という順番だと「複雑な手順にはなるものの適切な手順を通せば」同じApple IDでアカウント作成可能

失礼しました。
追加情報などあれば是非おねがいします!

概要

私はiOSアプリの開発を3年以上やっていますが、恥ずかしながら会社でこのためのアカウントを管理/運用する方法をきちんと把握できていませんでした。
というのも個人で開発するぶんにはそんな管理は必要なかったですし、これまで会社でアプリ開発するときも限られた数人だけが担当していたのでアカウントの管理とか必要がなかったのです(というのが言い訳です)。

おそらく、企業でiOSアプリ開発をしている人にとっては普通のことなんでしょうけど、私は今回はじめて知った部分がいくつかあったのでまとめさせていただきます。
どこかで困っているどなたかに参考になれば良いなというのと、もっとこうしたほうが良いというご意見をいただくのが目的です。

iOS Dev Center の構成

まず、iOS Dev Centerで今回説明する部分は以下のような構成になっています。

大きくは、

  • iOS Developer Program
  • Member Center
  • iTunes Connect

に分かれます。

メンバーを追加する方法が2つある??

今回、私が混乱してしまった部分がここでした。
iOSアプリ開発/公開のために必要なアカウントは、

  • Member CenterPeople
  • iTunes ConnectManage Users

の2カ所で管理されています。
また、この2つのアカウントはそれぞれ別々の用途になります。

個人開発のアカウントや、会社の代表アカウントを使う際には1つのアカウントでこの2つの役割を同時に担ってくれるため、この2つが違うということを気にしなくても良かったのです。

Objective-Cでカリー化とか部分適用してみる はてなブックマーク - Objective-Cでカリー化とか部分適用してみる

Permalink

導入

会社でHaskell勉強会に参加して、カリー化とか部分適用のパートの輪読当番になったのだが、正直、輪読時点でもそれがなんなのかよくわかっていませんでした。 しかし、勉強会で参加者のみなさまに教えてもらった結果、カリー化とかがやっと理解できました!

ということで嬉しくなって先日寝るときに布団の中で「Objective-Cでもできるかなー」と脳内コーディングしてみた結果を実装してみました。

もう他の人がやってるかもとか、こんなん実装しても実際のところ使わないよねとか、そんなことはまったく気にせずです。

実際やってみたソースコードは こちら に置いてあります。

ひとまずのゴール

カリー化して部分適用ができる状態までということで、Haskellのmapが実現できるところまでを目標にしました。

1
map (+3) [1, 2, 3]

これです。
Objective-Cでは当然、空白区切りで引数を渡していくような構文はないわけなので、関数ポインタ的なやつを使って、

1
map (+3) ([1, 2, 3])

みたいな形で()で区切り、関数の実行結果として取得した関数ポインタ(実際に関数が返すのはBlock)を使って次の引数を渡す(要するにカリー化)することでこれを実現することにしました。

しかし、Objective-Cには演算子を()で囲ってセクション化するとかないし、リストのリテラルも違うので、やるとしたらこうなります。

1
map (OP('+') (@3)) (@[@1, @2, @3])

セクションに関しては、演算子を関数化するマクロを作り、その関数に引数を1つ部分適用するイメージとします。

ということで、Objective-Cで上のmapが実現できたらはじめのゴールとしては十分かなと思いました。