2011年11月27日

xcodeのstoryboardでUINavigationを試してみました

Java人によるObjective-C挑戦

modalの次はUINavigarinControllerのpushも試してみたいと思います。

まずはプロジェクトを作ります。
Single View Applicationを選んで。。
1.jpg

Use StoryBoardにチェックをつけて作成します。
2.jpg
3.jpg

それでは今回のメインのstory boardでUINavigationをやってみます!
まず、storyboardのファイルをクリックします。
4.jpg

そこにはUIViewControllerしかないので。。
UINavigationControllerを右下から選んでドラックアンドドロップします。
5.jpg

ちょっとごちゃごちゃしてしまいましたので
全体をみたいと思います。
右下の虫眼鏡の(-)の方をクリックします。
6.jpg

整理すると今回作ったNavigationControllerと元からあったUIViewControllerがあるのが分かります。
7.jpg

最初に起動するControllerですが
今までの以下の記述の代わりに
 ”
  // ★この記述がstoryboard方式ですと不要になります★
  UINavigationController *navCtl = [[UINavigationController alloc] initWithRootViewController:firstViewCtl];
  self.window.rootViewController = navCtl;
 ”
GUIで初期のViewControllerをして設定できます。
8.jpg
9.jpg

initWithRootViewController:firstViewCtlは
connections inspectorにrootViewControllerにて指定しているようです。
9a.jpg

まずは最初の画面をデザインします。
a.jpg
b.jpg

ついにpushを使います。ボタンをpushにて元々あったViewControllerに繋いでみましょう!
c.jpg

せっかくなので最後の画面も装飾します。
d.jpg

これで出来上がりです。

実行結果のハードコピーです。
e.jpg
f.jpg

コーディングほとんど無しで画面遷移が作れます。面白いですねぇ。
#今後はこうやって開発するのが主流になるのでしょうか??

次はせっかくなので画面間での値の引き渡しをこのまま作って行こうと思います。

Java人によるObjective-C挑戦

posted by itokami1123 at 23:55| Comment(0) | 日記

2011年11月19日

iPhoneアプリ「算数先生」無料を公開しました。

1年生になる我が娘用に作ったiPhoneソフト「算数先生」(無料)をApple Storeで公開しました。
よかったら使ってみてください。


ituneTitle.jpg


使い方はこちら。
posted by itokami1123 at 13:31| Comment(0) | 日記

2011年11月16日

xcodeのstoryboardで画面遷移してみた(その2)

Java人によるObjective-C挑戦

前回の続きです。
モーダルの2画面目から値付きで1画面目に戻します。

まず、2画面目のdelegateを1画面目にする為
プロパティを用意します。(javaで言うインターフェース)


// SeccondViewDelegate.h
#import
@protocol SecondViewDelegate
- (void) secondClose:(NSString*)text;
@end


2画面目のControllerヘッダに
delegate格納先とテキストボックスのアウトレット
後、ボタン押した時に動くメソッドを準備します。

// SecondViewController.h
#import
#import "SecondViewDelegate.h"

@interface SecondViewController : UIViewController

// インスタンス変数は @propertyにする ★ 2011/11/19 修正
@property (nonatomic,retain) IBOutlet UITextField *textFiled;
// 自身のdelegate先(1画面目を設定するのでassign) ★ 2011/11/19 修正
@property (assign) id delegate;

// 画面1へボタンを押した場合
- (IBAction)moveToOneBtnDidPush:(id)sender;

@end


そいで実装します。

// SecondViewController.m
#import "SecondViewController.h"
@implementation SecondViewController
@synthesize textFiled;
@synthesize delegate;
・・・省略・・・
- (void)dealloc {
self.textFiled=nil;
self.delegate =nil;
[super dealloc];
}
- (IBAction)moveToOneBtnDidPush:(id)sender {
NSString *text = [self.textFiled text];
[delegate secondClose:text];

}
@end


storyBoardで画面遷移すると以下メソッドが呼ばれるとの事

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

なのでそのタイミングで1画面目(親画面)をdelegateとして設定します。
★呼び出しもと(今回は1画面目)に実装します★

// ViewController.m
#import "ViewController.h"
@implementation ViewController

・・・省略・・・
- (void) secondClose:(NSString*)text{
NSLog(@"secondClose");
[self dismissModalViewControllerAnimated:YES];
[self.textLabel setText:text];

}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"move001"]) {
SecondViewController *viewController = (SecondViewController*)[segue destinationViewController];
viewController.delegate = self;
}
}
・・・省略・・・

@end

そうすれば親画面のsecondCloseメソッドをモーダル画面から呼べ
値をセットすることが出来ます。

実行結果のスクリーンショット↓です。
storyBoard012.jpg
storyBoard013.jpg
storyBoard014.jpg
storyBoard015.jpg


-- (2011/11/19) 以下、2点修正しました。---
// インスタンス変数(メンバ変数)は @propertyにする
@property (nonatomic,retain) IBOutlet UITextField *textFiled;
self.textFiled = 値 とすると自動で前回の値のリリースと今回の値のretainを行ってくれるため
また、今後はdeallocで self.textFiled = nilで release を行おうと思います。
この方法ですと assign,retain関係なく解放できコーディングミスが減るからです。

// 自身のdelegate先(1画面目を設定するのでassign) ★ 2011/11/19 修正
@property (assign) id delegate;
これは、申し訳ないです。。
retainではメモリリークの原因になりかねない良くない書き方でした。。
ちなみにdeallocにはこちらも nil を指定しようと思います。


Java人によるObjective-C挑戦
posted by itokami1123 at 23:33| Comment(0) | 日記