複数のViewControllerを切り替える方法
前回の続き。オリジナルのタブバーを作って、複数のViewControllerをModalViewを使って切り替える方法について。
合ってるのかわからないけど、出来たので多分合ってる…はず!
まず、メインのViewControllerにデリゲートメソッドを作ります。
デリゲートについてはこの方の画像が初心者の自分には分かり易かったです。
http://kids-education.blog.so-net.ne.jp/upload/detail/m_delegate_modal.png.html
その後、切り替えたい各ViewControllerにこんな感じに実装して…
//オリジナルのタブバーが押された時の処理
- (void) changeMenu:(id)sender {
UIButton *btn = (UIButton*)sender;
NSString *next = [NSString stringWithFormat:@"%d",btn.tag];
if (![self.nowViewNumber isEqualToString:next]) {
//メインViewのデリゲートメソッドに押されたボタンの番号を送る(ついでに自身の番号も送ってます)
[changeViewDelegate_selectView:self.nowViewNumber :next];
//自身を閉じる
[self.navigationControllerdismissModalViewControllerAnimated:NO];
} else {
NSLog(@"同じよ!");
}
}
そして、メインViewではviewWillAppearで実装した所、出来なかったためviewDidAppearに実装した所できました。
- (void) viewDidAppear:(BOOL)animated {
//ボタン1が押された時
if ([self.nextViewNumberisEqualToString:@"1"]) {
FeedViewController *view = [[FeedViewController alloc] init];
UINavigationController *nav = [[UINavigationControlleralloc] initWithRootViewController:view];
view.changeViewDelegate_ = self;
//ボタン1を開く
[self.navigationControllerpresentModalViewController:nav animated:NO];
} else if ・・・省略
}
ちょっと簡単に書きすぎたかな…?いみわかんねーよ!って方がいたら是非言って頂けると嬉しいです!
これで画面の切り替えは楽々出来ると思います!
というかプログラムの部分だけ見やすく表示って出来そう…ブログの使い方も勉強しなくては!
UITabBarを使わないで独自のタブバーを作る方法を考える
UITabBarの途中にオリジナルの大きいボタンなどが配置する方法はUIButtonをタブバーに奇麗に合うようなデザインで置く方法がある。その際はそのボタンを押した際にその下にあるTabBarのボタンを押しておく方法にすればいいのかな…。
全部オリジナルのTabBarを作ってみたいって人はきっと多分以外と多いと思います。殆どは上記の方法でやっていると思われます。不確かな事書きすぎると誰かに怒られちゃうんで、もっと調べたら確実な事か書きたいと思います。
それで、オリジナルのTabBarの作り方としては単純日に端から端までのUILabelを作り、その上にUIButtonを配置することで出来る。あとはボタンごとにUIViewControllerを用意し、画面の切り替えの際はModalViewやpushViewを使ってAnimatedをNOにすればタブバーのように画面を切り替えてる感じになる。あるModalViewからModalViewを呼ぶ方法についてはただ今やってるので、少々お待ちを…。
予想ではメインのViewControllerからデリゲートで押されたボタンを認識して画面を切り替える方法が出来るのではないかと教わった。
例えば
メインビュー ➡ タブ1に切り替え(タブ1のModalViewを出す) ➡ タブ2ボタンを押す(メインビューにタブ2を押した事を知らせる) ➡ メインビューで現在のModalView(この時タブ1)を閉じる ➡ そのままタブ2のModalViewを出すことで切り替えられる。
出来たらこれも記事にまとめたいと思います!
UITableViewCellで画像を非同期でロードしようとしたときに困った事
/* 追記
出来るらしいです。試ししたらまた書きます!
*/
毎日書くぞと意気込んで、3日目にして時間オーバーした!笑
社会人で毎日ブログ書いてる方がいたらすごいと思う…。帰ってからじゃ0時過ぎちゃうからお昼とか、休憩の合間合間に書くのがいいんかなぁ。ちょっとそこらへんブロガーに聞きたい!
今日は既にあきらめた(ぁUITableViewCellへの非同期の画像のロードについて。非同期で画像をロードするにはNSURLConnectionがとっても簡単と誰かの記事に書いてあったので挑戦してみた。
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:メソッド内で
cell.imageView.image = [UIImagealloc]initWithData:data]; で画像がつけれる。
しかし、画像をURLから落とす場合は同期だととても重くなってしまうため非同期で行なう方が良い。
NSURLRequest *req = [NSURLRequest
requestWithURL:[NSURL URLWithString:_images]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:30.0];
_conn = [[NSURLConnectionalloc] initWithRequest:req delegate:self]; //非同期開始
こんな風にするだけであとは
//レスポンスを受け取ったら?
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
//受信中
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
//受信終わり
- (void)connectionDidFinishLoading:(NSURLConnection *)connection; //受信終わり
に値がダウンロードされていく。試してはいないけど、たくさんのスレッドがが始まってもレスポンスを受け取る〜受信完了までは1個1個みたい…?!
ここまでは色々な記事にもっと詳しく書いてあるからそちらをみたほうがいいでしょう。
では何が困ったのかというと、画像のダウンロードとCellに表示される順番がずれてしまうということ!
先に解決方法を書いておくと、ドラッグが止まった時にダウンロードを開始すればいい…らしい。
いやいや、ドラッグしてるときだってダウンロードしたいやん!!って思って何が何でもと挑戦した2日間。
ダウンロードが完了と同時に、
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:index inSection:0];
UITableViewCell* c = [self.tableView cellForRowAtIndexPath:indexPath];
c.imageView.image = [[UIImage alloc]initWithData:data];
[c setNeedsLayout];
でダウンロードが終わったコネクションとindexPath.rowを紐づけておけば直接indexPath.rowにダウンロード出来る…と妄想しました。
一応こんな感じ
NSString *str = [NSString stringWithFormat:@"%d%", _conn];
NSString *str2 = [NSString stringWithFormat:@"%d",index.row];
[_imageIndex setValue:str2 forKey:str];
結局できませんでした。
メモリが勿体ないってことで表示している部分以外のセルは適当っぽいらしい。再利用とかなんとか。
再利用を阻止すればチャンス合ったり…?!
フィード見たいの作りたいと思ったらセクションを1つ1つ作成して非同期すれば大丈夫みたい…。
とまたやってもいない妄想。そのうちフィードの方に挑戦します。
将来エンジニアとして生き残るために必要な事
記事の題名考えるって難しいね。
今回の題名は、「自分の目標」をただ言い換えているだけなのに…
なんかいいぞ。いいぞ自分。
日曜日だけは技術的な話ではなく、気になる記事とか、思ってる事をなるべく書きたいと思う。
まず、エンジニアって何?って所から始まるんだけど、技術を使って何かを作れる人かな。
でも最近、Webのクライアントサイドの技術に関して言えば、ソフトとかフレームワークとか使っちゃえば恐ろしく簡単に出来ちゃう…。そう、初心者だって。
Javascript周りはJQueryのおかげで難しい事覚えなくてもいいし、スマフォもTitaniumMobile使ってJavascriptで作れたり、ネイティブもXcodeのInterfaceBuilderやらStoryBoardが恐ろしいと思った。自分はまずはそういった機能も使わず勉強してるけど、どっちがいいのかな。わからない。。
とりあえず自分が必要だと思う事…4つ書きます!
1.企画力をつける
自分の今年の目標の1つでもあるんだけど、企画も考えられるエンジニアになる必要が有るんじゃないかなとは思う。作るだけに特化したエンジニアなんていっぱいいるだろうし、そういう人と差をつけるためにもこれは必要。企画力じゃないにしろ、営業力、ビジネス力…エンジニアの力以外のつけれる力はつけておいたほうがいいと思う。中途半端になるって?!毎日を見直すと案外作っているばかりじゃないはずさ!伸ばすチャンスはどこにでもある!!(学生だから暇なだけです、すいません)
2.広く中くらい、たまに深く
俺自身は広く浅く、たまに深く技術が使えるエンジニアを目指してたんだけど、先輩に「浅いはだめ、中までいかないと」と言われ見直しました。確かに浅いだけじゃただの物知り野郎になっちまう。この広くってのはいつでも新しい事業を行なうときに飛びつけたり、教えたりする時に便利と信じてる。本当はこんなのいいわけで、色んな技術を知りたくてたまらないってのが本音です…。それだと好奇心を満たしたら終わってしまうので、その技術を使って何かを作って、そして色んな物と連携してみるといいかもしれない。なるべく「中」以上を目指す!
3.どんなことも楽しく!
時にはエンジニア以外の仕事だってくるかもしれない、そんな時にどんな事も楽しく行なう事でエンジニア以外の能力が付き、いずれは良いエンジニアになってる…と信じたい。マネタイズのやり方だって、広報の仕事だってやってみたーい!的な。元々色々楽しめる方だったんだけど、面白法人カヤックの柳澤さんの本を読んでこの考えはさらに加速した。ぜひ読んでください!
4.色んな人と積極的に交流を!
色んな人と交流することでエンジニア以外の考え方を学んだり、同じエンジニアだとしても違う分野の方と話したりする事で刺激があっていい。毎日同じじゃつまらないし、何か変えるためにも積極的にやってみるのもいいかも。「憂鬱でなければ、仕事じゃない」で見城さんが言っているように、無駄なパーティやカラオケは行かない方がいいかなとは思う(社会人の方なら)。ランチとかディナーの時間はベストかも!
文字にすると思ってた事が意外と浅くて、意味不明な部分が多かった…という感想。
これが正しいっていうわけでもないし、まだ働いていない学生の意見なんで社会人の方はすっごい反論したいかもしれない。
それでも自分は、今年度はこれらを実行したいと思う!!!
Pitapat(旧facematch)でインターン始めました!!
まずは自己紹介からかな…
どうもSayKichoです。大学院2年生で、Webの業界に本格的に興味を持ったのが10月頃。そして、その流れで渋谷のある会社から内々定を頂きました。
11月ぐらいからの縁だか運の強さは中々のもので、その流れでPitapatさんにお世話になる事になりました!
まだ1週間ちょっとしかたってないですが…
えーっとブログむずいぞ。そうだブログの目的!
当面はiPhone開発について自分が苦戦した部分や、役に立つ技術的な紹介を目的にしたいと思います!
ちなみにObjective-cについては始めて1週間くらいのペーペーです。
言い忘れてましたが、ドMです。肉体的精神的どっちも可です。
舌から唾出せます。
ふー最初はこんなもんで大丈夫かな。最初は謙虚に!!!