[PR]
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
Tiny3D 1.0.0 リリースしました
App Storeを見に行きたい方はこちらのリンクからどうぞ
2009.01.28追記
日付の変更がされて27日に変わっています。現状ではPCのApp Storeでエンターテインメントのリリース順トップに表示されています。
2009.01.29追記
以前ブログでも発表いたしました半額セールですが、App Storeのエンターテインメントの項目でたまにリリース順リストから消えている(検索や直接リンクでの表示は可能でした)ことがあったため、ちょっとだけ延長して2009年2月4日までの実施とします。
リリースが遅れます
Tiny3D サンプル(日本語ページ)
Tab Bar ControllerとNavigation Controller
単なるView Controllerの場合:
[[tabBarController viewControllers] objectAtIndex:1]
Navigation Controllerの場合で今表示中扱いのViewのController:
[(UINavigationController *)[[tabBarController viewControllers] objectAtIndex:1] topViewController]
という具合になります。じゃあ代表クラス外ならどうなるかというと、以前の記事に書いたように、
Tiny3DAppDelegate *appDelegate = (Tiny3DAppDelegate *)[[UIApplication sharedApplication]delegate];
というような感じでまず代表クラスの参照を得てから、先ほどのtabBarControllerをappDelegate.tabBarControllerに置き換えて表記します。これまでに代表クラスのヘッダをインポートしていない場合には、忘れずにインポートしておきましょう。
一つ手前の階層のビューへ戻る
- AnotherViewController.mでnumberOfRowsInSectionのreturnを0から1にする。
- 前回と同様、cellForRowAtIndexPathで「cell.text = @"back";」をreturnの上の行に追加する。
- didSelectRowAtIndexPathに「[self.navigationController popViewControllerAnimated:YES];」を追加する。
ビルドして進行すると、前回と同様にテーブルが表示され、項目のタップで下の階層に移動します。ここでテーブルの項目であるbackをタップすると、上の階層のテーブルに戻ります。実際のプログラムでの応用ではdidSelectRowAtIndexPath内で戻る前に選択内容を変数に保存したり選択に伴う処理を入れれば良いわけです。なお、これらのアクションをIBActionメソッドとしておきボタンのタップ等で実行するようにすれば、テーブルではないビューでも同様の動作を行わせることができます。
お手軽ナビゲーション方法
- Navigation-Based Applicationのプロジェクトを新規作成します。プロジェクト名は何でも構いません。
- RootViewController.mで、viewWillAppearのコメントアウトを外し、中に「self.title = @"abc";」を追加します。中括弧の中であれば行の順番は気にしなくて大丈夫です。
- numberOfRowsInSectionのreturnを0から1に変更します。
- その下のcellForRowAtIndexPathの「return cell;」とある行の上にある空白の行に、「cell.text = @"123";」と記述します。
- 左側のリストのClassにTableViewControllerを新規ファイルで追加します。名前はAnotherViewControllerとします。
- RootViewController.mで冒頭の「@implementation」の上の行に「#import "AnotherViewController.h"」を追加します。
- didSelectRowAtIndexPath内のコメントのうち下3行の「//」を消します。
- 左側のリストのResourcesにView XIBを新規ファイルで追加します。名前はAnotherViewとします。
- AnotherView.xibを開き、File's OwnerのクラスをIdentity InspectorでAnotherViewControllerに変更します。
- ライブラリからTableViewをドラッグ&ドロップで追加し、もともとあるViewは消します。追加したTableViewのdataSourceとdelegateをFile's Ownerに接続します。File's OwnerのviewをTable Viewに接続します。
ビルドして進行すると、タイトルがabcという名前のテーブルが表示されます。123という項目をタップすると、右にスクロールして別のテーブルが表示されます。abcと書いてあるボタンを押すと、左にスクロールして元のテーブルに戻ります。
テキストフィールド間の移動
1.まずXcodeでビューのテキストフィールドと対応するポインタを、テキストフィールドの数だけヘッダファイルのビューコントローラーの中括弧内にIBOutretを頭に付けて記述します。
例:IBOutlet UITextField *xValueTextField;
2.先ほどの中括弧の終わった後で@endより前の部分にプロパティを記述します。先ほどのポインタと対応するようにします。
例:@property (nonatomic, readonly) UITextField *xValueTextField;
3.メソッドファイルの@implementationより下の部分に@synthesizeを記述します。これも名付けたテキストフィールドの数だけ行います。
例:@synthesize xValueTextField;
4.dealloc関数内にポインタの解放を記述します。これも名付けたテキストフィールドの数だけ行います。
例:[xValueTextField release];
5.少なくともヘッダファイルを保存してからInterface Builderでビューのnibファイルを開きます。
6.それぞれのテキストフィールドを紐付けし、先ほど付けたポインタ名とそれぞれのテキストフィールドを対応させます。次にはじめに入力を行うテキストフィールド(例ではxValueTextField)をクリックします。
7.Attributes InspecterのText Input TraitsにあるReturn KeyをNextにします。これでこのテキストフィールドをタップした際、表示するキーボードに「改行」ではなく「次へ」というボタンが表示されます。
8.一度Interface Builderを閉じてXcodeに戻ります。変更内容は保存しておきましょう。
9.ビューのヘッダに、関数の宣言を追加します。関数の名前は好きなものを付けてください。
例:-(IBAction)xNext;
10.メソッドファイルに関数の本体を追加します。この例では次のテキストフィールド(yValueTextField)を入力可能状態にする命令を入れてあります。
例:
-(IBAction)xNext {
[yValueTextField becomeFirstResponder];
}
11.やはり少なくともヘッダファイルを保存した後、Interface Builderを開いて先ほどのビューコントローラーの紐付け用のウインドウ(黒っぽい色のもの)を表示します。
12.Received Actionsに先ほど追加した命令があるので、はじめに入力を行うテキストフィールド(例ではxValueTextField)へ紐付けします。この時、イベントの種類としてDid End On Exitを選びます。
以上で操作は完了です。こうすることで、例の場合ははじめのテキストフィールドでキーボードの「次へ」をタップしたときにxNext関数が実行され、yValueTextFieldが入力可能状態となり、入力用のキーボードが表示されます。なお、はじめに入力状態にするテキストフィールドの指定は、例の場合だとViewWillAppear関数に、
[xValueTextField becomeFirstResponder];
と書いておけばビューが表示された時点でxValueTextFieldが入力可能状態になります。
代表クラスのポインタ取得
Tiny3DAppDelegate *appDelegate = (Tiny3DAppDelegate *)[[UIApplication sharedApplication]delegate];
[appDelegate setEdited];
#import "Tiny3DAppDelegate.h"
id appDelegate = [[UIApplication sharedApplication]delegate];
objc_msgSend(appDelegate,@selector(finishDownload));
各セルにアクセサリーを設定する
- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath
{
return (self.editing) ? UITableViewCellAccessoryDetailDisclosureButton :
UITableViewCellAccessoryDisclosureIndicator;
}
UITableViewCellAccessoryNone:何も表示しません。
UITableViewCellAccessoryDisclosureIndicator:灰色の>を表示します。
UITableViewCellAccessoryDetailDisclosureButton:青丸に>記号が入ったボタンが表示されます。
UITableViewCellAccessoryCheckmark:チェックマークを表示します。
なお、以前の記事「前回起動時の選択項目にチェックマークを付ける」に書いたように、セルのプロパティ(accessoryType)を直接設定する方法もあります。この命令は初期設定用として、表示してからの動的な変更にaccessoryTypeを使うようにすると良いでしょう。
2009年11月7日追記
iPhone OS 3.0以降では上記のtableView:accessoryTypeForRowWithIndexPath:は使用できません。今のところは一応動きますが、ビルド時に警告が出るようになります。この場合はtableView:cellForRowAtIndexPath:内でUITableViewCellのプロパティaccessoryTypeとeditingAccessoryTypeを用いて通常及び編集時のアクセサリーを設定すると良いでしょう。