iPhoneのビューを複数使い,切替を行なう時はUINavigationControllerを使いました.今回はナビゲーションバーを利用せずにViewの切替を行ないます.
• Viewの呼出し
• [呼び出し元ViewController presentModalViewController: 呼出し先ViewController animated:アニメーションON/OFF];
• 例 [self presentModalViewController:modalViewController animated:YES];
• 元のViewに戻る
• [呼出し先ViewController dismissModalViewControllerAnimated: アニメーションON/Off];
• [self dismissModalViewControllerAnimated:YES];
自動的にViewの切替準備を行なうUINabigationControllerは複数のView切替が存在する場合に利用するのが最適だと思います.主にナビゲーションバー機能の切替やその他ナビゲーションアイテムを利用するときに使用します.
ViewControllerのモーダルビュー機能を使い,少数のView切替を行なう場合に最適だと考えます.ナビゲーションバーは表示させるとその分,表示面積が小さくなってしまうので,各自のアプリケーションによって使い分けるのがよいでしょう.
文字や数字を入力するときに必須なキーボードについて.
UITextFieldのプロパティkeyboardTypeを変更する事で「数字キー」「電話キー」「アドレス用キーボード」などなど8個のタイプに設定できます.
• UIKeyboardTypeDefault - ローカライズされたキーボード
• UIKeyboardTypeAlphabet - アルファベットキーボード
• UIKeyboardTypeASCIICapable - ASCIIのデフォルトキーボード
• UIKeyboardTypeNamePhonePad - 名前入力サポートの電話キーパッド
• UIKeyboardTypeNumbersAndPunctuation - 数字入力フルキーボード
• UIKeyboardTypeURL - URL入力に使用するキーボード
• UIKeyboardTypeNumberPad - 数字テンキー
• UIKeyboardTypePhonePad - 電話キーパッド
• UIKeyboardTypeEmailAddress - 電子メールアドレス入力キーボード
この中のUIKeyboardTypeNumberPadの左下には空白があいています.ココに任意のカスタムボタンが配置できるのではないかと考えています.根拠は
iPhoneの画面ロックを解除するパスワード入力場面はUIKeyboardTypeNumberPadが使用されており,左下に「緊急電話ボタン」が配置されているからです.
画像ボタンを作成して上レイヤーとして配置している方法かもしれません.が,別にカスタムする方法があるものかもしれません.
判明したときは追記します.
アプリケーション作りで動作に時間制限が必要なことは色々なアイディアを出す中で自然と感じるはずです.Foundation のNSTimer を使ってカウントダウンを作ってみました.作ったことがあるけど,改めてiPhone版で書いてみました(ほとんど,Mac版と変わりませんね).
Xcode
• ~ViewController に
•NSTimer *timer
•NSDate *stDate
•NSDate *nowDate
を設置
• タイマ表示用のIBOutlet UILabel*を設置
• ~ViewController.m
•stDate, nowDateを初期化
•timer = [NSTimer scheduledTimerWithTimeInterval:(1.0)
target:self
selector:@selector(onTimer:)
userInfo:nil
repeats:YES];
でメインループに呼び出す関数と呼出し間隔を登録
•この処理はタイマー開始時に実行するのが要
•今回はボタンを押して実行-(IBAction)action:(id)senderに書く
•selector:@selector(~~:)にはインターバル毎に呼び出すメソッドを指定
•onTimer(名前は任意)を作成
•nowDateをNSDateクラスのdateメソッドで現在時間を取得
•nowDateのtimeIntervalSinceDate メソッドでstDateとの差分を取得
•上記の差分から任意の数値を引く(例.timeLimit - [nowDate timeIntervalSinceDate:stDate])
•秒単位での起動なのでtime / 60で分
•time % 60で秒
Interface Builder
• ViewにUILabelを設置
• ~ViewControllerのUILabelとバインド
• ボタンをバインド
タイマーをメイン処理にn秒毎のメソッド呼出しを登録する事でカウントダウンや時間に応じた作業が出来ます.変数stDate はnowDate と比較する静的基準です.タイマー開始時にstDateとnowDate を初期化して時間を記録します.そして,n秒毎にNSDate クラスのtimeIntervalSinceDate でstDate とnowDate の差分をとります.カウントダウンなら(設定時間 - stDateとnowDateの差分)で出来ます.タイマーが0になったらインスタンスtimerのinvalidateメソッドでメインループから実行登録を消します.
n秒置きに現在位置を取得することやサーバとの通信を定期的に行なうにはこういったタイマーが必要になるので練習しておくと良いっすね.
Timer.zip
ユーザインタフェースの見栄えや仕組みがアプリケーションの質を左右するというので,UINavigationController を使いこなせるように試してみました.今まで使ったこと無かったんですけど(えぇぇ!!今更っ),便利ですねぇ.ざっとやり方を自分用にメモしておきます.もっと細かく書いてある人もいるので探してみるとよいでしょう.
Xcode
•~AppDelegate.hにUINavigationControllerクラスのインスタンス変数を追加(*naviControllerとしておきましょう)
•~AppDelegate.m内の[window addSubview:viewController.view]の代わりに[window addSubview:naviController.view]を記入
InterfaceBuilder
•MainWindow.xib内にUINavigationControllerを追加
•UINavigationController内のroot view Controllerを削除
•代わりに元々あった~ViewControllerを追加
•無い場合はUIViewController追加してクラスをインスペクタのClass Identityで自分が作成した~ViewControllerに指定(xibファイルを持つ場合はNIB Name を記入しましょう)
•Xcodeで~AppDelegate.hに追加したnaviControllerとUINavigationControllerをバインド(関連づけ)します
ココまでの手順でNavigationBarが表示されるようになります.
次にアイテムボタンを自動的に作成してくれるやり方を記述します.
Xcode
•~ViewController.hに次のUIViewControllerを保持するインスタンス変数を容易
•~ViewController.mの初期化時(id)initにself.title = @"title"でタイトルを任意に変更
•-(void)viewDidLoadにボタン作成を記入
•[super viewDidLoad]と self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc]
initWithTitle:@"next"
style:UIBarButtonItemStylePlain
target:self
action:@selector(button:)] autorelease]を追加
•ボタン作成時に記入した@selectorのbuttonメソッドを作成(ボタンが押された時の動作)
•用意したUIViewControllerのインスタンス変数をallocする
•プッシュされるViewControllerをpushViewControllerに引き渡し
•[[self navigationController] pushViewController:nextViewController
animated:YES]を追加する
InterfaceBuilder
•各UIViewControllerのインタフェースで必要になったらアイテムを随時追加
UINavigationController内に含まれるUIViewControllerにはNaviBarのアイテムが自動的に付加されます.アイテムの自動付加はとても便利なのでやっぱり実際に書いてみて勉強するとありがたさが実感できます.
今後,ちょくちょくノートしていきます.
navitest.zip
ついにSDKもfinalを迎え,iPhoneも発売されました.安定収入が無い学生の私には,月額は支払いきれないので,個人的な購入は断念という形になるでしょう.もし,タッチのみの利用を考えるのならiPod touchで我慢するしか無いですね.iPhoneを買った方でiPod touchを所持している方にはぜひとも安価で譲ってほしい物です.
さて,HelloWorldプログラムを作成し,iPhoneアプリの構造を勉強し,開発の「いろは」の「い」を完了しました.この「い」はまず,知っておくべきObjective-CとInterfaceBuilderとの関係、MVCモデル開発を知ることです.Mはモデル,Vはビュー,Cはコントローラを表します.
•モデルとは,ソースコードなどの実装部分を指します.ココでは実際の計算や処理手順などを書き込む部分です.
•ビューは,ユーザが目に見えるインターフェースの部分を指します.InterfaceBuilderを使い,GUIの設計を行ないます.
•コントローラは,上記2つのモデル,ビューを結びつける役割を果たします.
モデルとビューの入出力をそれぞれ関連づける作業をCocoaAPIのBind,「CocoaBinding」と呼びます.CocoaBindingについては他にも多くの記事が存在しますので,そちらを検索,参照してください.
CocoaBindingを理解した上で,タッチパネルに表示されたボタンをタッチすることで画面上にHelloWorldを表示するプログラムを作成しました.
1.Xcodeの新規プロジェクト内のView-Based Applicationから始めます
2.~VewController.hに以下を入力します
@interface testViewController : UIViewController {
IBOutlet UILabel *helloworldLabel;
}
- (IBAction)acceptButton;
@property (nonatomic, retain) UILabel *outputLabel;
@end
3.InterfaceBuilderで~ViewController.xibを編集します
4.ViewにUILabelをはりつけ,File's Owner のoutletから2で記述したhelloworldLabelとUILabelを関連づけます
5.4と同様にUIButtonをViewにはりつけ,UIButtonのEventとFile's Owner のactionから2で記述したacceptButtonと関連付けをします
6.Xcodeに戻り,~ViewController.mに以下を入力します.
@implementation testViewController
@synthesize outputLabel;
- (IBAction)acceptButton {
[outputLabel setText:@"helloworld"];
}
@end
以上をコンパイル,実行することでシミュレータ上で動作する簡単なHelloworldプログラムが完成する訳です.
次はタッチした位置の座標を表示するプログラムのまとめをしようと思います.
リファレンスをいくつか読み始めて,求めていた内容と読んでいたリファレンスの内容が違うのでいくつか,読む順番を変えつつ,実装も視野に入れた進め方をしています.現段階ではベータ5が出てから,いくつかのAPIが変わったのを確認しているので,既にある日本語のリファレンスレビューを参考にした上で,本家リファレンスを読み進めていく事にしました.とりあえず,備忘録程度にまとめて更新していけたらと思います.
これまでに内容が読み取れたリファレンス類
• Core Location
:基本的にデバイスの位置情報を取得するメソッド,プロパティが用意されていますが,プロパティに標高、高度などを格納するものがあったため,このCLLocationクラスはGPSセンサを利用するためのクラスではないかと思います.今のところwifiの電波強度で取得できる位置情報は主に水平位置しか取得できないと聞いています.altitudeの解釈が間違ってなければ,高度を利用するセンサはGPSがメジャーなので,iPhone2.0はGPS搭載は確実ではないかと.実装想定にGPSの利用は考えていないので,このクラスを調べるのはこれで終了.
•UIKit Function Reference
:このリファレンスに関してはイメージ変換や画面,画像サイズの取得を主に取り扱っているようです.後々にUIの設計や自動生成で利用する機会はあると思いますが,今回は優先順位を下げて読み飛ばしをする事にします.
•UIAcelerometer Class Reference
:iPhone及び,iPod touchに搭載されている加速度センサを利用するクラスであるようです.直接,このクラスオブジェクトは作成できませんが,インターバルを設定することは出来るようです.イベントが発生するたびに作成されたアプリケーションのメインスレッドに通知されるそうです.このリファレンスは,今後利用すると思うので,このまま読み進める対象としていきます.
前回,記述したリファレンス類
• System
• System Configuration
• Foundation
• CFNetwork
以上のリファレンスは膨大な量なので,とりあえず後回し.
とりあえず,UIKitとネットワーク関係をこのまま読み進めようと思います.
その他の中心的な部分は必要時に探していくという形をとっていきます.
これまで読んできたけど,自分の英語に自信が持てた部分と,単語力が足らない自分を見つけました.