気になる

アフェリエイト旅行

自動車

家庭菜園

« イカ玉  (お好みカロリーじゃなくて、小麦粉ナシでw) | トップページ | ホットフラッシュで冬を快適に過ごすには ロングウォーマー必須 »

2013/08/31

私の最高の良書「iPhoneプログラミング入門」プロトコルとデリゲートも完璧!

プロトコルとデリゲート。
これにつまづいてグルグル同じ所を何度も歩んでいる状態の中・・

iphoneアプリ開発なんて、もう無理。やっぱり素人には出来ないんだ。と諦めかけていたその時、最高の良書に出会えました!
涙出そうになってたけど笑顔でガッツポーズになりました♪(^O^)
「iPhoneプログラミング入門」&ネットサポートページで、データ受け渡しが理解出来、プロトコルとデリゲートも完璧!に♪
m(__)m m(__)m m(__)m m(__)m m(__)m m(__)m 
超初心者の方に、おすすめの本です。

****************************

プロトコルとデリゲート。
これにつまづいてグルグル同じ所を何度も歩んでいる状態の中・・

ネットで、この説明文が私にとって分かりやすい!と感動するサイトを発見!
2010年発売書籍「「iPhoneプログラミング入門(清水美樹)工学社」のサポートページとして、著者ご本人が書かれています。

私が持っている本で取り上げているテーブルとかタブとか色々と同じく使い方を学ぶことなんですが、これが超分かりやすい!!!

既に持っている本は:
こう書くべきものなのでそう書いて下さい。として粛々とプログラム作りが進められていきます。(旦那様も、決められた書き方なんだからその通りにやってそれをそのまま覚えればいいんだよと言います)

この著者は:読み進めながら、文体が口語調で書かれていて、1つ1つを掘り下げて詳細に説明をしてくれています。しっかりと頭の中で「理解」出来ながら進んでいく♪素晴らしい!w

おかげさまで、多くのハテブがついていておすすめなんだろうな的な
以前からブックマークしていた、ブログ記事「ちゃんと理解しながら読めました」

ストリーボードを利用してのセグエはコチラ↓がとっても分かりやすいです。

後、頭の中でグルグルしていたselfとかsenderが下記のブログでやっと理解。遅っw
「オブジェクトは複数生成することができる」←重要! どのオブジェクトか?はsenderが教えてくれる。そのsenderを利用して、コードを書き足せば又色々出来る。

動的。が理解出来ていないとつらい。下記参考

日本人最高!素敵な指導者達、本当にありがとう。・°・(ノД`)・°・
英語がさっぱりの私には、とってもとってもありがたいです。

著者の元書籍がすっかり欲しくなりました。ヾ(=^▽^=)ノ 

が・・
アマゾンでの購入者評価は・・口語調だから読みづらい、出来上がるプログラムは1個だけ?と書かれていて、ちょっと引いてしまいましたが、私にとって理解しやすいのであれば十分な価値がある!と購入を決意!

ただ2010年のものなので、進化ペースの速いxcodeに作業内容が古いことを重々承知で「新本」を購入するのはちょっと如何な物か?と躊躇があり、中古本でいっかー!( ̄▽ ̄*)ゞ オブジェクト思考とは、オブジェクトCの作法とはを知りたいだけだし。。。

内容は最高!やっぱり買ってヨカッタ!

口語調については、私にとっては目の前で先生が講義をしているかのような情景が浮かぶくらい親切丁寧に思えました。笑いも入れながらなので、きっと後で・・何かコードを下記ながら、「あぁ、あの突っ込みを言ってた部分ね」と思い出し笑いをしながら明確に作業を進められていくんだろうなぁと感じております。ヾ(▽⌒*)


届いた中古書籍。。。
中を開くと・・うわっ!マーカーがいっぱい。
・°・(ノД`)・°・

返品出来るらしいけど・・。

やっぱ、長い間使い込もうと思う書籍は、新書購入が一番ですね!


-----------------------------------------------------------------------------------------
書籍を読むのは1日で終わります。w
もう1日、読みなおして頭に入れて、実際にプログラムを書いてみる。
評判にあるように、簡単なプログラム。(^O^)
で、本を見ないで同じプログラムを3回書いてみる。復習ですね。
-----------------------------------------------------------------------------------------
さて・・ネット上で追記されているブログ内容を、今回はプリントアウトして本格的に進んでいきます!!!
※xcodeがどんどんバージョンアップしているので
最新版で使いこなせるように、ストリートボードを使用。Acr(自動でメモリ管理)も使用、Nibは使用してない環境で作業を進めていきます。(*^_^*) 頑張れ!自分!w
と、その前に
感謝・
感謝・感謝・感謝・感謝・感謝をば。
清水美樹 さん。
本当に、ほんとうに、ホントウニ。ありがとうございます。
m(__)m
-----------------------------------------------------------------------------------------
では、いざ、スタート!
■戸惑ったところ
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    
	/*
	 <#DetailViewController#%> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
     // ...
     // Pass the selected object to the new view controller.
	 [self.navigationController pushViewController:detailViewController animated:YES];
	 [detailViewController release];
	 */
}
うっ。。。
「initWithNibName」って・・初めて見るコードが出てきました。(・_・;) 情報が古いからしょうがないですね、でストリートボードではどう書くのかをググッてみると下記ブログさんで紹介されてました。ありがとうございます。

DetailViewController *detailViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailView"]; [self.navigationController pushViewController:detailViewController animated:YES];
↓↓↓↓↓
  1. 【画面】storyboard上に、viewController をドラッグ・アンド・ドロップして(red用の)ウィンドウ&ビュー画面を作成。
  2. 【コード】その画面用のViewController.hと.m(クラス)が必要なので、(File→New→File)名前をredViewControllerとして作成。
  3. 【結ぶ】双方を結ぶために、storyboard上でredViewController画面を選択して、右横の画面からCustomClassをredViewController選択。
  4. 【遷移先セッテイ】identityのstoryboardIDに目印(指示子)としてredと入力。
  5. MasterViewController.mに#import "redViewController.h"と記述

    redViewController *viewController =

    [self.storyboard instantiateViewControllerWithIdentifier:@"red"];

    [self.navigationController pushViewController:viewController animated:YES];

おぉ!出来た♪w

で、コードを書いていくと・・ん?
自画面が、ナビは上に出ていて戻るボタンとして「Master」と表示され、肝心のビュー画面が真っ黒。(・_・;) ビューがpushされてなくて、もろwindowが見えている??? 階層が間違っている?

UIViewController *nextViewController = [[NSClassFromString(controllerName) alloc] initWithNibName:controllerName bundle:nil];と、教書では書けと書いてあるが・・

何しているかサッパリ?(´・ω・`)
なので、分解してった。

指定したセルの値から文字列を得て+"ナニナニViewController"という文字列を作る

//セルに書かれている文字列を代入   
NSString *pathRow = [theList objectAtIndex:indexPath.row];
    NSLog(@"%@",pathRow);   

//文字列+文字列(セルに書かれている文字列+ViewController文字列)

    NSString *className=[[NSString alloc] initWithFormat:@"%@ViewController",pathRow];
NSLog(@"%@",className);

↓一行で書きたければ、コチラ

    NSString *controllerName=[[NSString alloc] initWithFormat:@"%@ViewController", [theList objectAtIndex:indexPath.row]];

    NSLog(@"%@",controllerName);

//クラス名の取得方法を調べた。

NSString *className = NSStringFromClass([self class]) ;
NSLog(@"%@",className);

↓一行で書きたければ、コチラ

NSLog(@"%@", NSStringFromClass([self class]));

延々、分解&表示をさせて知識は深まったが・・
ストリートボード利用でやっているんだから【initWithNibName】これ使うと言ってもNibなんてものは無いよ。と怒られる?そりゃそうなんですが・・
(・∀・)

他にinitがあるのか、リファレンスを出してUIViewControllerを見ると。うーん無い?(-_-;) ストリートボード活用しろよ!ってことなんですね。

諦めて、ストリートボードでコードを書くようにした。(;・∀・)
どうせ教習所の言いたいところは、使い回しって発想を教えてくれているだけだろうし。でも実際はstoryboardIDを使うんだから、このコードは超便利というわけでは無いし。。。クスン

//storyboardIDを目印にして、ViewController生成
UIViewController
*nextViewController = [self.storyboard instantiateViewControllerWithIdentifier:[theList objectAtIndex:indexPath.row]];
//ナビゲーションにpush表示
    [
self.navigationController pushViewController:nextViewController animated:YES];

出来た♪(^O^)/
1日半、時間つぶした。w

push表示だったら、それこそセグエが便利だよね。www

//pushじゃなくて、モーダルで出したい場合
//(上に、単なるビュー画面が表示される)

   [self presentViewController:nextviewController animated:YES completion:nil];


------------------------------------------------------------------------------------

■データの受け渡し(新しいページにデータを送る)

  1. 新しいページ(今回は、redViewControllerクラスを利用)
  2. ストリートボード上の、redViewControllerのビュー画面へラベルをドラッグ・アンド・ドロップで追加。(中の文字は消しておく)
  3. ボードと、コードを結びつける。
    1つ目のプロパティとして
    ラベルをredViewController.hへドラッグ・アンド・ドロップしてOutlet textLabel。
    2つ目のプロパティとして
    ラベルの中身を受け取る為ように
    NSStringクラスでlabelStr、(nonatomic,copy)を記述。
  4. コードを記述(ページ先)
    redViewController.m内に、
    ロードされた時に、ラベルのテキストに中身である
     self.textLabel.text = _labelStr;を、- (void)viewDidLoad{}中に記述
  5. コードを記述(ページ元)
    MasterViewController.m内に ←呼び出し側の、元画面

redViewController *nextViewController =[self.storyboard instantiateViewControllerWithIdentifier:@"red"];

NSString *sendStr = [[NSString alloc]initWithFormat:@"%@",[theList objectAtIndex:indexPath.row]];

nextViewController.labelStr = sendStr;   
[self.navigationController pushViewController:nextViewController animated:YES];

を、ーdidSelectRowAtIndexPath{}中に記述。

(redViewControllerクラスを利用してViewControllerオブジェクトを作っているので、元画面のテーブルに表示されている red / green /blue どれをタップしても、ページ先は赤い背景が表示されてて ラベルの中身に文字列 が各々表示される)

★プロトコルと、デリゲートについては下記のブログがまとまっていて、わかりやすかったです。(^O^)/


-----------------------------------------------------------------------------------------
■データの受け渡し(元のページヘデータを返す
でました・・一番躓いているプロトコルと、デリゲート
<<まずMainの画面を作りこむ>>
  1. 新規プロジェクトを作成(ViewController:UIViewController)
  2. ストリートボード上のビュー画面に、右下から部品アイコンを必要な分
    ドラッグ・アンド・ドロップで乗せていきます。
  3. 部品アイコンは3個。
  4. 1個目:画面中央に、ラベルを乗せる(中の文字列テキストは消す)
  5. 2個目:ナビゲーションバーを乗せる。
  6. 3個目:そのナビゲーションバーの右隅に、ボタンを乗せる。
<Main画面の部品アイコンを、.hと結びつける>
  1. 1個目:ラベル:IBOutlet:showLabel:(プロパティ)
  2. 2個目:無し
  3. 3個目:ボタン:IBAction:editButtonPressed:(メソッド)
<<次にMyModalの画面を作りこむ>>
  1. 新規プロジェクトを作成(MyModalViewController:UIViewController)
  2. ストリートボード上のビュー画面に、右下から部品アイコンを必要な分
    ドラッグ・アンド・ドロップで乗せていきます。
  3. 部品アイコンは2個。
  4. 1個目:画面上部中央に、テキストフィールドを乗せる
  5. 2個目:そのすぐ下あたりに、ボタンを乗せる。
<MyModal画面の部品アイコンを、.hと結びつける>
  1. 1個目:テキストフィールド:IBOutlet:msgText:(プロパティ)
  2. 2個目:ボタン:IBAction:showButtonPressed:(メソッド)
これで、2つの画面が出来ました。(^O^)/
Mainの画面のボタンを押すと、MyModal画面が表示されるようにします。
ViewController.mの、- (IBAction)editButtonPressed:(id)sender{}の中に、自分よ(self)!遷移先をポップしろ(presentViewController)!遷移先はこの画面ネ(mvController)!的にw記述する。

 MyModalViewController *mvController = [self.storyboard instantiateViewControllerWithIdentifier:@"modal"];   

    [self presentViewController:mvController animated:YES completion: nil];

と、ここまでは普通のよくある出来事。
ここから私の難題(
プロトコルと、デリゲート)に取り組みます。

自分でプロトコロを書くところから。(;・∀・)

●プロトコルは、独立して書いてもいいし(ヘッダーファイル)、今回のようにちょっとしたことをさせたいだけだから、今あるファイルの中にそのまま書いちゃおー!でもいい。

※その際は、MyModalViewController(私を使ってねー!側。 .h)に書く。

<1:自前プロトコルを書く>

  1. MyModalViewController.hファイルの中の、@interface + @endの下に書く。エンターキーばんばんしてずーっとはるか下にぽそっと書くと「あぁ、別ファイルでもよい記述なんだよねー」感覚が理解しやすいかもしれない。w
  2. 追記:
    @protocol
      MyModalViewControllerDelegate <NSObject>
    -(void)mymodalViewController:(MyModalViewController *)mymodalViewController didClose:(NSString *)message;
    @end
<2:プロトコルを私使いますよ!宣言する>
  1. MyModalViewController.hファイルの中の、#import <UIKit/UIKit.h>の下に書く。
  2. 追記:
    @protocol
     MyModalViewControllerDelegate;
<3:プロパティでdelegateを用意する>
  1. MyModalViewController.hファイルの中の、@interface MyModalViewController : UIViewControllerの下にでも書く。
  2. 追記:
    @property (nonatomic, assign) id<MyModalViewControllerDelegate> delegate;
<4:通知したいイベントが発生したタイミングで、delegateのプロトコルに書いたメソッドを呼び出す>
  1. MyModalViewController.mファイルの中の、- (IBAction)showButtonPressed:(id)sender{}の中に書く
  2. 追記:
    [_delegate mymodalViewController:self didClose:self.msgText.text];
●丸投げ
文字列受け取ったけど、その情報処理は誰かやってねー(使ってねー)
【デリゲート使う】*******************
私は、Main。
その文字列を受け取って、
Main画面の中央にあるラベルに、表示させたい。
<1:使うよー>
  1. ViewController.hの中に、
    まず、#import "MyModalViewController.h" と書き足してから
  2. 次に、@interface ViewController : UIViewControllerの右横に書く
  3. 追記:<MyModalViewControllerDelegate>
※一行で見ると
@interface ViewController : UIViewController <MyModalViewControllerDelegate>

<2:私が使うからねー(delegateプロパティは、私)>
※delegateプロパティにオブジェクトの参照の代入
  1. ViewController.mの中の、- (IBAction)editButtonPressed:(id)sender {}内にすでに書かれている記述の下に書き足す
  2. 追記:
    mvController.delegate = self;
全部見ると

- (IBAction)editButtonPressed:(id)sender {

 MyModalViewController *mvController = [self.storyboard instantiateViewControllerWithIdentifier:@"modal"];   

    [self presentViewController:mvController animated:YES completion: nil];

    mvController.delegate = self;

     }

ココでちょっと躓いた。なぜココに書く?
「Main画面のボタンをタップして、遷移先の画面をポップさせる」このタイミングに書くわけ?って。(´・ω・`) 
解説では、「MyModalViewController」クラスのオブジェクト「mvController」を作成したら、そのmvControllerのプロパティ「delegate」に「わたし」を指定する。とある。
私です。私です。私です!!!
そのプロパティdelegateは、わたしです!!!!!
他のところで書いちゃダメなのかしら。。。
時間があったら掘り下げてみよう。(-_-;)
<3:プロトコルに書かれているメソッドを書く>
本丸〜♪MyModalViewControllerから丸投げされた(テキストフィールドに入力された文字列)を、使っちゃうわよー!
投げられた文字列を、
Main画面にあるラベルのtextに代入!
Main画面が見えるようにするには、
ポップ画面として見えているMyModalViewController画面を閉じる(dismissViewControllerAnimated)。
  1. ViewController.mの中の、一番下あたりにでも書き足す
  2. 追記:

    -(void)mymodalViewController:(MyModalViewController *)mymodalViewController didClose:(NSString *)message{

        self.showLabel.text = message;

    //    [self.navigationController dismissViewControllerAnimated:YES completion:nil];

        [self dismissViewControllerAnimated:YES completion:nil];

    }

    「//」コメントになっている部分は・・
    教書では、ナビゲーション画面でポップされている前提の書き方なんですが、hiyokoが作ってしまったのは、ただのビュー画面w なので、それに対応するようself.navigationController 部分を単なるself としました。^^;

出来た〜♪長かった〜!!!
ここまでたどり着くのに、どれだけの時間が過ぎ去って行ったことか。。。w
もう一度!
清水美樹 さん。
本当に、ほんとうに、ホントウニ。ありがとうございます。
m(__)m
できることなら・・
xcode最新バージョンに対応させて、是非!新書を書いて下さい!
お金払って買う価値あります!(T_T) マジに!
------------------------------------------------------------------------------------
コード。
<ViewController.h>

#import <UIKit/UIKit.h>

#import "MyModalViewController.h"

@interface ViewController : UIViewController <MyModalViewControllerDelegate>

- (IBAction)editButtonPressed:(id)sender;

@property (weak, nonatomic) IBOutlet UILabel *showLabel;

@end

<ViewController.m>

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad

{

    [super viewDidLoad];

 // Do any additional setup after loading the view, typically from a nib.

 // Dispose of any resources that can be recreated. 

}

- (void)didReceiveMemoryWarning

{

    [super didReceiveMemoryWarning];

}

- (IBAction)editButtonPressed:(id)sender {

 MyModalViewController *mvController = [self.storyboard instantiateViewControllerWithIdentifier:@"modal"];   

    [self presentViewController:mvController animated:YES completion: nil];

    mvController.delegate = self;

     }

-(void)mymodalViewController:(MyModalViewController *)mymodalViewController didClose:(NSString *)message{

    self.showLabel.text = message;

//    [self.navigationController dismissViewControllerAnimated:YES completion:nil];

    [self dismissViewControllerAnimated:YES completion:nil];

}

@end

<MyModalViewController.h>

#import <UIKit/UIKit.h>

@protocol MyModalViewControllerDelegate;

@interface MyModalViewController : UIViewController

@property (nonatomic, assign) id<MyModalViewControllerDelegate> delegate;

@property (weak, nonatomic) IBOutlet UITextField *msgText;

- (IBAction)showButtonPressed:(id)sender;

@end

@protocol  MyModalViewControllerDelegate <NSObject>

-(void)mymodalViewController:(MyModalViewController *)mymodalViewController didClose:(NSString *)message;

@end

<MyModalViewController.m>

#import "MyModalViewController.h"

@interface MyModalViewController ()

@end

@implementation MyModalViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

{

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    if (self) {

 // Custom initialization

    }

 return self;

}

- (void)viewDidLoad

{

    [super viewDidLoad];

 // Do any additional setup after loading the view.

}

- (void)didReceiveMemoryWarning

{

    [super didReceiveMemoryWarning];

 // Dispose of any resources that can be recreated.

}

- (IBAction)showButtonPressed:(id)sender {

//    [_delegate mymodalViewController:self didClose:_msgText.text];

    [_delegate mymodalViewController:self didClose:self.msgText.text];

}

@end


------------------------------------------------------------------------------------

« イカ玉  (お好みカロリーじゃなくて、小麦粉ナシでw) | トップページ | ホットフラッシュで冬を快適に過ごすには ロングウォーマー必須 »

MacMini」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

« イカ玉  (お好みカロリーじゃなくて、小麦粉ナシでw) | トップページ | ホットフラッシュで冬を快適に過ごすには ロングウォーマー必須 »

google検索

  • Google


    このブログを検索
    ウェブ全体から検索

カテゴリー

ニュース

  • 日経平均(長期)

    株価ミニチャートのブログパーツ
  • 経済指標(発表と内容)へのリンク
    http://jp.investing.com/economic-calendar/
  • 経済指標
  • . . .
  • 日経平均チャート
    by 株価チャート「ストチャ」
  • 株指標
2019年9月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30