スタンフォード大学のiPhoneアプリ開発講座の宿題(Presence 4)

これが最後の宿題(最後の自由課題を除く)となるわけだが、Presence 4の課題はPresence 3を更に機能エンハンスするという内容。そのエンハンス項目は以下。


1. UITabBarControllerを利用して複数のメニュー(タブ)があるアプリにする。
UITabBarControllerを利用する事で複数のメニューを持つアプリケーションにする事が出来る。
Presence 3にUITabBarControllerを追加するのはそれほど難しくなく、Interface BuilderでUITabBarControllerを追加し、AppDelegateクラスを少し修正するだけで良い。修正箇所は以下。

// Presence4AppDelegate.h
@interface Presence4AppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    // UINavigationController *navigationController;
    UITabBarController *tabBarController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
//@property (nonatomic, retain) IBOutlet
//                      UINavigationController *navigationController;
@property (nonatomic, retain) IBOutlet
                         UITabBarController *tabBarController;
// Presence4AppDelegate.m
- (void)applicationDidFinishLaunching:(UIApplication *)application {
    // [window addSubview:[navigationController view]];
    [window addSubview:tabBarController.view];
    [window makeKeyAndVisible];
}


2. Public Timelineのユーザを表示するメニューを追加する
メニューの1つとしてTwitterのPublic Timeline上のユーザリストを表示する物を追加する。
これは基本的にPresence 3までで利用していたPersonListViewControllerをほぼそのまま利用する事で実現出来る。
コードを再利用するために、本メニュー用のViewControllerとPersonListViewControllerの共通のスーパークラスを作る方法等があるが、私の場合はPersonListViewControllerをそのまま利用した。

具体的にはInterface Builderで1つ目のタブと2つ目のタブのどちらにもPersonListViewControllerを指定し、それぞれ別の"Title"を指定する(例:"Favorite"、"Public" 等)。そして、PersonListViewControllerの中で以下のように自身の"Title"属性によって処理を切り分けるという方法で、同じクラスを異なるタブに使用する事が可能となる。

// PersonListViewController.m
if ([self.title isEqualToString:@"Favorites"]) {
    // ローカルのInfo.plistからユーザ情報取得
} else if ([self.title isEqualToString:@"Public"]) {
    // Twitterからユーザ情報取得
}


3. Twitterの公開つぶやきから指定した検索キーワードにマッチしたつぶやきだけを表示する
メニューの1つとしてTwitterの公開つぶやきから指定した検索キーワードにマッチしたつぶやきだけを表示するという物を追加する。
これは講義で習ったようにUISearchBarを利用して実現する。
TwitterHelperクラスにあらかじめ指定した検索文字列にマッチするつぶやきだけを取得するメソッド(fetchSearchResultsForQuery)が用意されているので、これを使えば簡単にこの課題は実現出来る。

たた、このタブのTopViewControllerにUITableViewControllerを使っていると、UISearchBarの下にTableViewの1行目が隠れてしまうという問題が発生したので、以下のブログの情報を参考に、UIViewControllerを利用する形にした。


4. アドレス帳との統合
ユーザ名を表示するテーブルビューにDisclosure Buttonを表示し、それが押されたらアドレス帳を表示するようにする。
ユーザが既にアドレス帳に登録されていた場合にはそのユーザ情報を表示し、そうでない場合にはアドレス帳に新たに追加出来るようにする。
スタンフォードのホームページで提供されているSocialBookというサンプルを参考にすれば問題なく出来る課題である。


追加課題
追加課題としてPresence 4用のpreferences bundleを用意するという物がある。これはiPhoneの「設定」メニューにPresence 4用の設定メニューを追加するという物であるが、この独自設定メニューの追加に関しては以下のブログに分かりやすく書かれている。