[iOS] UIWebView でPDFを表示する

2011年1月6日木曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

[前回] Cocoaの日々: [iOS] UIWebView でリッチテキスト形式のファイル(*.rtfd)を表示する

肝心のPDFを忘れていた。確認しておく。

サンプル


いい感じだ。
- (IBAction)load5:(id)sender
{
 NSURL* url = [[NSBundle mainBundle] URLForResource:@"sample"
           withExtension:@"pdf"];
 NSURLRequest* req = [NSURLRequest requestWithURL:url];
 
 [self.webView loadRequest:req]; 
}


問題


直前に表示した文書(今回の場合PPT)が背景に残ったままになる現象があった。
-[UIWebView reload] を呼び出してみたが効果なし。うーむ。



ソースコード


GitHub からどうぞ。
DisplayingExcelFile at 2011-01-06 from xcatsan/iOS-Sample-Code - GitHub

[iOS] UISplitViewController - おぼえ書き

2011年1月5日水曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

iPad 用アプリの開発を開始。UISplitViewController について調査した(そのおぼえ書き)。

Split View-based Application


Xcode のテンプレートから UISplitViewController を選ぶ。

実行するとこんな画面が表示される。
縦にするとポップオーバー表示になる。


構成


構成イメージはこんな感じ。
UISplitViewController を構成するコントローラの指定はInterface Builder のインスペクタで設定してある。

UISplitViewController.viewControllers の中身はこう。
(
    "<UINavigationController: 0x4d2e290="">",
    "<DetailViewcontroller: 0x4d2e5f0="">"
)
UISplitViewController.view の構成はこう。
UIView
  |-UILabel
  |-UIToolbar
    |-UIToolbarTextButton
      |-UIPushButton
UILayoutContainerView
  |-UINavigationTransitionView
  |-UINavigationBar
    |-UINavigationItemView
なるほど。

RootViewController は UINavigationController に載っているので、階層的なビューの切り替えができるようになっている。この辺りはこれまでの iPhoneアプリと同じようにできる。試しに SubViewController を良いして遷移させてみた。
RootViewController.m

- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    
    detailViewController.detailItem = [NSString stringWithFormat:@"Row %d", indexPath.row];
 
 UIViewController* viewController = [[SubViewController alloc] initWithNibName:nil bundle:nil];
 [self.navigationController pushViewController:viewController animated:YES];
 [viewController release];
}

画面の回転により UISplitViewControllerDelegateのメソッドが呼び出される。

– splitViewController:willHideViewController:withBarButtonItem:forPopoverController:
 横 => 縦 により、左側のビューが隠れる時

– splitViewController:willShowViewController:invalidatingBarButtonItem:
 縦 => 横 により、左側のビューが表示される時

– splitViewController:popoverController:willPresentViewController:
 ポップオーバーが表示される時


ソースコード


サンプルはこちら。
SplitViewBaseSample at 2011-01-05 from xcatsan/iOS-Sample-Code - GitHub

[Mac] NSArrayController に Undo/Redo を実装する [6] ソート指定のUndo/Redo

2011年1月4日火曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

[前回] Cocoaの日々: [Mac] NSArrayController に Undo/Redo を実装する [5] 選択のUndo/Redo

次はソートの Undo/Redo。


ソートの Undo/Redo


NSTableView でカラムヘッダをクリックするとソート処理が行われる。この時に setSortDescriptors: が呼ばれるのでこれをオーバーライドしてやればいい。
- (void)setSortDescriptors:(NSArray *)sortDescriptors
{
    [[self.undoManagerprepareWithInvocationTarget:self]
        setSortDescriptors:[selfsortDescriptors]];
    [supersetSortDescriptors:sortDescriptors];
}

できた。図じゃわかりずらいが。

ソースコード


GitHubからどうぞ。

ArrayControllerUndoSample at 2011-01-04 from xcatsan/MacOSX-Sample-Code - GitHub

[Mac] NSArrayController に Undo/Redo を実装する [5] 選択のUndo/Redo

2011年1月3日月曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

[前回] Cocoaの日々: [Mac] NSArrayController に Undo/Redo を実装する [4] 初期値ありの場合

選択状態も Undo/Redo してみる。

選択状態の Undo/Redo


NSArrayController の選択に関係するメソッドをすべてオーバーライドしてやる。
- (void)_registSelectionToUndo
{
    [[self.undoManagerprepareWithInvocationTarget:self]
      setSelectionIndexes:[selfselectionIndexes]];

}
- (BOOL)setSelectionIndex:(NSUInteger)index
{
    BOOL result = [supersetSelectionIndex:index];
    if (result) {
        [self_registSelectionToUndo];
    }
    return result;
}

- (BOOL)setSelectionIndexes:(NSIndexSet *)indexes
{
    BOOL result =  [supersetSelectionIndexes:indexes];
    if (result) {
        [self_registSelectionToUndo];
    }
    return result;
}

- (BOOL)setSelectedObjects:(NSArray *)objects
{
    BOOL result =  [supersetSelectedObjects:objects];
    if (result) {
    [self_registSelectionToUndo];
    }
    return result;
}

- (BOOL)addSelectedObjects:(NSArray *)objects
{
    BOOL result = [superaddSelectedObjects:objects];
    if (result) {
        [self_registSelectionToUndo];
    }
    return result;
}

- (void)selectPrevious:(id)sender
{
    if ([selfcanSelectPrevious]) {
        [self_registSelectionToUndo];
    }
    [superselectPrevious:sender];
}

- (void)selectNext:(id)sender
{
    if ([selfcanSelectNext]) {
        [self_registSelectionToUndo];
    }
    [superselectNext:sender];
}

できた(画像じゃわかりずらいが)

ソースコード


GitHubからどうぞ。

ArrayControllerUndoSample at 2011-01-03 from xcatsan/MacOSX-Sample-Code - GitHub

[Mac] NSArrayController に Undo/Redo を実装する [4] 初期値ありの場合

2011年1月2日日曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

[前回] Cocoaの日々: [Mac] NSArrayController に Undo/Redo を実装する [2] カスタムモデル

初期値が存在する場合、前回までのコードでは対応できない。

初期値ありへの対応


これまでのアーキテクチャではカラムの値を KVO 登録擦る必要があり、これをレコード挿入時に行っていた。ところが初期値ありの場合、レコード挿入のメソッドは呼ばれない。代わりに setContent: が呼ばれるのでこれをオーバーライドしてやる。
- (void)setContent:(id)content
{
    [self_addObserverFor:content];
    [supersetContent:content];
}

できた(画像ではわからないが)。


ソースコード


GitHubからどうぞ。

ArrayControllerUndoSample at 2011-01-02 from xcatsan/MacOSX-Sample-Code - GitHub

Cocoaの日々 - 2011年元旦

2011年1月1日土曜日 | Published in | 2 コメント

このエントリーをはてなブックマークに追加

あけましておめでとうございます。
本年もよろしくお願いします。

今年も元旦は自分のことについて思いつくままに少し書きます。


昨年


昨年は前半に妻の入院、双子の誕生と大きなイベントが続き、後半は子育てに追われてプライベートでは忙しい一年でした。一方仕事ではHTML5ベースのWEBアプリの新機能開発や初のiPhoneアプリ開発に携わることが出来てそれなりに充実した経験がつめたと思います。

このブログ執筆を含む趣味のプログラミングは、前半にSimpleCapの多言語版をリリース出来たものの、その後は成果らしい成果が出せず低調だったと反省しています。双子が生まれてからというものの完全に子育て中心の生活になった影響は大きくて、趣味のプログラミングに時間が取れないだけでなく度々ブログの更新もサボって遅れてしまう日々が続きました。昨年はホントに看板に偽り有り状態でした。。時間が取れない、更新ができないという状態はノドに刺さった小骨の様で少なからずストレスがあったかなと振り返ると思います。


朝プログラミング


ただ9~10月ごろから赤ちゃん達が育ってきて少し息がつけるようになったのと、朝プログラミングを始めるようになってから状況が改善してきた。朝プログラミングとは、毎朝出勤の1〜2時間前に会社近くのカフェへ行き朝食を食べながらMacBook Pro を開いてプログラミングすること。その分早く起きなければならず毎朝5〜6時に起きて暗いうちに出勤するという生活になりましたが、プログラミングが出来る時間が取れる!という嬉しさは何事にも代え難く大変ということは全くありませんでした。

カフェでは毎朝お決まりのモーニングを頼み、窓際のカウンター席でトーストをかじりながらニュースをチェック、その後iPhoneのRADIKOでInterFMのバラカンモーニングを聴きながらGitのブランチを切ってプログラミングを開始、なんてことが日課になった。あまり多くの事はできないので、毎回小目標を立てて達成できればコミットしてマスタへマージする。ここまでできるとその日は朝から気分がいい。出勤後の仕事も気分良く始められる。朝プログラミングが出来るようになった副産物として、帰宅した後に子供達の事、家庭の事に専念するよう気持ちの切り替えが出来るようになったこともある。こうして、ちょっとした生活スタイルの工夫だけれど、このブログと趣味プログラミングと家庭の両立を今後も続けて行く自信がついたのは昨年一年の一番の収穫かもしれない。ただ難点はMacBookProが重くて持ち運びがやや難儀なこと。Lionが出た後にAirモデルが出たら欲しい。。


カフェプログラミング


朝プログラミングとは別に、月に一度土曜日などの休日に都心へ出かけて朝から夕方まで一日中カフェでプログラミングするようになりました。カフェは1日に何件かをハシゴします。これは集中できてかなりはかどる。ただカフェは場所を選ぶのが重要。駅や繁華街から少し離れた所や休日は人の少ないオフィス界隈にあるスタバがオススメです。人が多いところは集中しずらい。場所は東京駅、秋葉原、新宿が多い。この前試した池袋のスタバは人が多くて失敗だった。それはさておき、一日休みをくれる妻に感謝!



今年の趣味プログラミングの目標


  • SimpleCap1.3と1.4をリリースする
  • 個人制作のiPhoneアプリを一本リリースする
  • Ruby On Railsを使った情報サイトを構築して公開する


最後に


今年もこのブログは毎日更新[*1]をモットーにやって行きます。これからもよろしくお願いします。
(2011年1月1日自宅にて。赤ちゃんを片腕で抱っこしつつもう一方の手で3GSを握り執筆。校正はMacBookを使用)

[*1] 実際は毎日更新ができずに後から日付だけ辻褄を合わせている時もありますがそこはご容赦を^^;


参考情報


(旧) Cocoaの日々: Cocoaの日々 - 2010年元旦

ネイリスト向けアプリ hair Concierge(ネイル・コンシェルジェ)が公開されました

2010年12月31日金曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

ネイリスト向け顧客管理 iOS 向けアプリ「hair Concierge(ネイル・コンシェルジェ)」が AppStore で公開されました。

先日公開された「hair Concierge(ネイル・コンシェルジェ)」の姉妹版となります。今回もプログラミングで参加しています。以下技術解説。


アーキテクチャ


プログラムのほとんどは前回リリースの hair Concierge と同じものを使っている。大きく違うのはマスタデータとデザイン。その他、一部のコードでそれぞれ独自の処理が入っている箇所がある。これらを Xcode に複数のターゲットを導入して一つのプロジェクトで管理するようにした。
ターゲットを切り替えることで作成するアプリを切り替えている。

デザインは構造やサイズは同じだがそれぞれのベースカラーに合わせて変えてある。これらを管理する為に、それぞれのターゲット用に Resourcesグループを用意し、実フォルダもそれぞれ作成してある。
画像ファイルのターゲットはこんな感じ。これでターゲット毎に使用する画像を切替えられる。
一部異なるインターフェイスを持つ部分は同名の Nibファイルをそれぞれ用意し、画像と同じくフォルダとターゲットを分けて管理する。


注意点など


2つのアプリを1つのプロジェクトで管理するにあたり、ファイルの名前を変えたりしたのだがそれが原因でいくつかのトラブルが発生した。詳細については以前紹介したのでそちらを参照のこと。

Cocoaの日々: [iOS] プロダクト名を変えてはいけない
Cocoaの日々: [iOS][Mac] CoreData - マイグレーション[4] モデルファイルの構成


参考情報


Cocoaの日々: 美容師向けアプリ hair Concierge(ヘア・コンシェルジェ)の技術解説


- - - - -
ブログ更新がなんとか年内に間に合った。それでは良いお年を!

人気の投稿(過去 30日間)