View間で変数の値を渡すには

Tab Bar の双方のビュー間で変数の値を渡す方法が分からず四苦八苦。

最終的にグローバル変数を使って参照する方法に至ったんだけど、
なんか違う気がする…。

でもとりあえず欲しい結果にはなったんで覚書。


〜UITextFieldのテキストを受取る場合〜

・AppDelegate.hに同じ型のグローバル変数を定義
 #import <UIKit/UIKit.h>
 UITextField *gname1;

・FirstViewController.hでテキストフィールドを用意
 @interface FirstViewController : UIViewController<uitextfielddelegate> {
 IBOutlet UITextField *name1;

・FirstViewController.mにインポートしてテキストフィールドを格納
 #import "AppDelegate.h"
 gname1 = name1; //グローバル変数に格納

・SecondViewController.hで受け取り側の変数用意(今回はNSString)
 NSString *name[10];

・SecondViewController.mで受け取る
 name[0] = gname1.text;

メソッド、引数、戻り値

まだシックリこないので、念のため。

- ヘッダ -

- (int)keisan:(int)i1:(int)i2;

- メソッド -

- (void)viewDidLoad
{
[super viewDidLoad];

int a = 1;
int b = 2;
int c = [self keisan:a:b];

NSLog(@"%d",c);
}

- (int)keisan:(int)i1:(int)i2{

int d = i1 + i2;
return d;
}


なんかカナリどーでもいー事書いてるよなぁ…。
物覚えの悪さを痛感する。orz

ボタンでビュー移動

最初のビューを「View1」、移動先を「View2」とする。

・UIViewController subclass(View2)を作成。

・View1のヘッダに、
 -(IBAction)push;

・View1のメソッドに、
 #import "View2.h"

 -(IBAction)push{
  View2 *controller = [[View2 alloc]initWithNibName:@"View2" bundle:nil];

  // アニメーションの種類を設定
  controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;

  [self presentModalViewController:controller animated:YES];

  [controller release]; // allocしたらrelease
 }


もどる時

・View2のヘッダに、
 -(IBAction)back;

・View2のメソッドに、
 -(IBAction)back{
  [self dismissModalViewControllerAnimated:YES];
 }

効果音をつける

・AudioToolbox.frameworkを追加。

・ヘッダに、
 #import <AudioToolbox/AudioServices.h>

 @interface ViewController : UIViewController {
  SystemSoundID sound01;
 }

・メソッドに、
 - (void)viewDidLoad{
  [super viewDidLoad];
  NSString *path1 = [[NSBundle mainBundle] pathForResource:@"voice01" ofType:@"aif"];
 NSURL *url1 = [NSURL fileURLWithPath:path1];
 AudioServicesCreateSystemSoundID((CFURLRef)url1, &sound01);
 }
 と、定義しといて、

・使いたいところで、
 AudioServicesPlaySystemSound(sound01);

標準テンプレの罠?

View-based Applicationテンプレートでプロジェクトを作成して、
そのまま実行するとiOS3.2の場合エラーになる。

iOS4.0以降なら大丈夫なのに、
iOS3.2(iPadシム)だと以下ような感じでフリーズ。

----------------------------------------
self.window.rootViewController = self.viewController;
で、
Thread 1:Program received signal: "SIGABRT".
と、表示されてシミュレーターがフリーズ。
----------------------------------------

初心者ゆえ、何が何だか分からないんだけど、
調べた結果、一応の解決を見たので覚書。

ようは「rootViewController」ってのがiOS4.0以降でないとイカンらしい。

なのでエラーが出ている以下の行を、
 self.window.rootViewController = self.viewController;

次のように変更すると良いらしい。
 [self.window addSubview:self.viewController.view];

とりあえず小生の環境では改善できたのでヨシとする。

線を引いてみる

・Window-based Applicationでプロジェクト作成

・[New File...] > [iOS] > [Cocoa Touch] > [Objective-C class]
 Subclass of 「UIView」としてUIViewを継承したクラスを作成。
 (クラス名:lineView)

・IBでViewをはりつけ、
 [Custom Class]の[Class]を「lineView」にする。

・「lineView.m」に

- (void)drawRect:(CGRect)rect {
 CGContextRef context = UIGraphicsGetCurrentContext();
 CGContextMoveToPoint(context, 0,0);
 CGContextAddLineToPoint(context, 320,460);
 CGContextStrokePath(context);
}

アプリの多言語化

English環境でEnglishとJapaneseの2言語化する場合。

・プロジェクトを右クリックしてファイルを追加。
 [New File...] > [iOS] > [Resouce] > [Strings File]
 名前は「InfoPlist.strings」にする。

・できた「InfoPlist.strings」をクリックして、
 Xcode4右ペインの[Localization]の[+]マークをクリック。
 [Japanese]を選択。

・「InfoPlist.strings」の下にそれぞれの言語の設定ファイルができる。
 内容はアプリ名とアプリのアイコン表示名らしい。

 CFBundleName = "アプリ名";
 CFBundleDisplayName = "アプリ名";

 とか書いとけば良いっぽい。

・同じ手順で「Localizable.strings」の設定ファイルも作る。
 こっちの中身は、

 Localizable.strings(Japanese)には
 "森林" = "森林";

 Localizable.strings(English)には
 "森林" = "Forest";

 とかいった感じ。

 実際にプログラム内で使う場合は、

 NSLocalizedString(@"森林", @"")

 と書くと、日本語環境で「森林」、英語環境では「Forest」と表示される。

 設定ファイルは、左がキー文字、右が変換後の文字となるので、
 上の例だと日本語の設定ファイルは無くても大丈夫。(と思う)

ピッカービューの実装

〜ヘッダ〜

@interface soukakuViewController : UIViewController<UIPickerViewDelegate> {

    IBOutlet UIPickerView *picker;

}


@property(nonatomic,retain)UIPickerView *picker;



〜メソッド〜

@synthesize picker;


- (void)dealloc

{

    [super dealloc];

    [picker release];

}


//ピッカーの列数

- (NSInteger) numberOfComponentsInPickerView:(UIPickerView *)pickerView {  

    return 4;

}


//ピッカーの行数

- (NSInteger) pickerView: (UIPickerView*)pView numberOfRowsInComponent:(NSInteger) component

{

    switch (component) {

        case 0:

            return 3;

            break;

            

        case 1:

            return 3;

            break;

            

        case 2:

            return 2;

            break;

            

        default:

            return 2;

            break;

    }

}


//ピッカーの列幅

- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent: (NSInteger)component {

    switch (component) {

        case 0:

            return 95;

            break;

            

        case 1:

            return 95;

            break;

            

        case 2:

            return 50;

            break;

            

        default:

            return 50;

            break;

    }

}


//ピッカーのラベル

- (NSString*)pickerView: (UIPickerView*) pView titleForRow:(NSInteger) row forComponent:(NSInteger)component {


    switch (component) {

        case 0:

            switch (row) {

                case 0:

                    return [NSString stringWithFormat:@"あいうえ"];

                    break;

                    

                case 1:

                    return [NSString stringWithFormat:@"かきくけ"];

                    break;

                    

                default:

                    return [NSString stringWithFormat:@"さしすせ"];

                    break;

            }

            break;

            

        case 1:

            switch (row) {

                case 0:

                    return [NSString stringWithFormat:@"あいうえ"];

                    break;

                    

                case 1:

                    return [NSString stringWithFormat:@"かきくけ"];

                    break;

                    

                default:

                    return [NSString stringWithFormat:@"さしすせ"];

                    break;

            }

            break;

            

        case 2:

            switch (row) {

                case 0:

                    return [NSString stringWithFormat:@"100"];

                    break;

                    

                default:

                    return [NSString stringWithFormat:@"200"];

                    break;

            }

            break;

            

        default:

            switch (row) {

                case 0:

                    return [NSString stringWithFormat:@"300"];

                    break;

                    

                default:

                    return [NSString stringWithFormat:@"500"];

                    break;

            }

            break;

    }

}


//ピッカー操作後の処理

- (void) pickerView: (UIPickerView*)pView didSelectRow:(NSInteger) row  inComponent:(NSInteger)component {


    int row1 = [picker selectedRowInComponent:0];

    int row2 = [picker selectedRowInComponent:1];

    int row3 = [picker selectedRowInComponent:2];

    int row4 = [picker selectedRowInComponent:3];


    NSLog(@"%d, %d, %d, %d", row1, row2, row3 ,row4);

}



アニメーション終了判定とか

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1]; //アニメーション時間(秒)
[UIView setAnimationDelegate:self]; //下の1行とセットでアニメ終わったら判定ができる
[UIView setAnimationDidStopSelector:@selector(ballinhall)]; //終了後飛ぶ先を指定
CGAffineTransform scale = CGAffineTransformMakeScale(0.5, 0.5); //拡縮
[ball setTransform:scale]; //上の1行とセットで拡縮(0.5だと50%縮小)
[ball setAlpha:0.0]; //透過率(0.0で完璧な透明になる)
[UIView commitAnimations];

オブジェクトの座標を取得

posx = button.center.x;
posy = button.center.y;

結構悩んだんだけど答えはシンプル…。

それにしても基礎ゼロで突っ走ってるから、些細な事でつまずくな。

分かる人に聞くと決まって「基礎をしっかり勉強しろ」って言うけど、
初心者はその基礎をどうやって勉強すればいいのかが分からなくて困るんだよ…。


ロリポップ!レンタルサーバー

写真素材とか販売なう!


search this site.

calendar

S M T W T F S
     12
3456789
10111213141516
17181920212223
24252627282930
<< September 2017 >>

selected entries

categories

archives

links

profile

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM