2013/07/26

続・ほぼ初めてのiOS開発

後藤です。

みんなサボりがちなものの 私だけはちゃんと毎週続けていこうと思っていましたが、とうとう先週サボってしまいました。(ブログの投稿を)
エラーが出るたびにネタとしてちゃんとためていたので、今週はちゃんと更新します。

書き忘れていましたがXcodeのバージョンは4.6.3です。


■ TableViewがあるのにないと言われる

2013-07-05 18:12:02.175 SmartReort[3602:c07] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UITableViewController loadView] loaded the "KuI-1g-SwH-view-lpF-QE-BSf" nib but didn't get a UITableView.'

遷移先のViewにTableViewが存在しないというエラーのようです。でもさすがに私が初心者とはいえ、Storyboadで遷移先の画面にUITableViewを置いていないような心当たりがあったらすぐに気付きます。置いていたのに出たのです。
こちらについては、調べていて無事原因がわかりました。

ふつうUITableViewが配置されているViewはTableViewとOutletで繋がっているようなのですが、これがなぜか切れており、それでViewがTableViewを認識してくれなかったみたいです。

ViewとTableViewを後から繋げる方法についてはわからず、まだ設計初期だったこともあり TableViewControllerを新しく配置し、画面を作りなおすことで解決しました。
もう新しく画面を作りなおすのは…という場合も、遷移後画面の実装ファイルにloadViewメソッドを追加し、その中でself.viewにTableViewをコードで追加するようなことでもできるようです。

参考
ios - nib but didn't get a UITableView - Stack Overflow
TableViewを使おうとしたらエラーがでた。 - 毒林檎のBlog


■ UITableViewCellのCustomCellに貼りつけたUITextViewをクリックするとセルがタップできない

ラベルの上はクリックしてもちゃんとセルをタップしたことになるのに、TextViewはならない。TextViewの範囲以外をタップすればきちんとセルをタップできる。
そもそもViewというものをしっかり理解しきれていないところがまだありますが、とにかくUITextViewやUIViewなどはViewの上に覆いかぶさったようになってしまって タップするとそちらを認識し、その下にあるViewは認識できないようです。

解決策は、UITextViewをタップで認識させないようにすること、だけどそこにたどり着くまでが…。そもそもViewがどうのというよりCellにTextViewなんかを貼るからいけないんだとばかり思っていたので、そこを今井さんに指摘して頂くまで気付きませんでした。

あらかじめCellのTextViewはストーリーボードのAttributes inspectorでTagの番号を設定しておいて、cellForRowAtIndexPath:メソッドあたりで
     UITextView *textView = (UITextView *)[cell viewWithTag:1];
     [textView setUserInteractionEnabled:NO];
とすることでちゃんとTextViewは認識しないようにできました。

こんなメソッドUITextViewクラスの公式リファレンスに書いてない…と思ったけれど、UIViewのサブクラスだからってことですよね。Javaのリファレンスが確か継承したものも全部書いてあったので、その感覚でいました。これからはちゃんとスーパークラスも見るようにします。。

参考
UIViewで後ろにあるViewを認識させる方法 - hachinobuのメモ
もうひとつsetUserInteractionEnabledの存在を知ることになったきっかけのサイトがあった気がするけど、どうやってたどり着いたのか忘れてしまいました。


■ 'release' is unavailable: not available in automatic reference counting mode
■ ARC forbids explicit message とXcodeに怒られた


カメラを閉じるところで[picker release];を書いたら赤いのが出ました。この2つはセットで出るもようです。
理由は、iOS5からはARCがメモリ管理を適切に行ってくれるので、releaseは書かなくてもいい(というか書いてはいけない)とのこと。カメラに限らず、ARCが関係しているところをreleaseしようとすると怒られるみたいです。どこだったか忘れてしまいましたが他でも同じエラーが出たことがあります。

Appleのカメラ操作のプログラミングのドキュメントは情報が古いようで(13/07/19現在)ドキュメントの通りに書いてるとそのように出てしまいます。[picker release];を消すことで解消しました。

参考
ARC forbids explicit message send of ‘autorelease’ | iPhone&Android端末向けのアプリ開発忘備録
‘release’ is unavailable: not available in automatic reference counting modeエラー | Koji's Blog


今回はそのような感じでした。内容が前のものと似ているので件名を前回の続きという風にしたものの、もう1ヶ月くらい経ちますし、iOS開発も大分慣れてきました。勝手が分かってくるとやっぱりプログラミングは面白いです。
弊社ではスマホアプリ等とサーバ側で通信を行うようなサービスを開発する際にThriftを利用していますが、それも最近Bootcampで習い、使いこなせて…いるかどうかはまだ分かりませんがJavaとCocoaでのデータのやり取りをできるようになりました。これからも色々と学んでいきたいです。

以上、後藤でした。



.

2013/07/15

最近のケイフィールド

後藤です。

今週は…というかもう先週ですが、JBossのサンプルをBootCampで進めているのと、あとは先週に引き続きiOS開発、そしてインターンシップ用のUnityの資料作りなどを行いました。
もう1ヶ月もしないうちに、高校生さんのインターンシップが始まります。私もUnityは今月から触り始めた初心者なので、教えれるようもう少し極めておきたいところです。

さて、iOS開発で何か書くことができるかなと思っていたのですが 今週は特に大きな壁にはぶつからず書くネタもないので、また最近のケイフィールドのことを書こうと思います。

金曜に社長のお誘いで、社員4人全員でチキンボーイというお店に行って参りました。今池駅から歩いて3分くらいのところです。焼き鳥とビールのお店でした。小さいお店で品切れのものが多かったのが残念でしたが、食べたものはどれも美味しかったです。
私はビールはまだ飲めないのですが(苦手で…)、 他の3人は色々と飲んでらっしゃいました。お酒を楽しめる大人になりたいものです。社長は今池ビールという地ビールがお目当てだったようで、お土産で買っていたようです。お味はどうだったんでしょうか。

写真は、奥のがウィンナーで手前のが食べかけですが鶏皮キムチーズというやつです。ウィンナーも鶏だったらしいです。おいしかったです。



2013/07/11

ブレインストーミングを積極的に取り入れる

山田です。

ケイフィールドで年に数回行っているインターンシップの準備を進めているのですが、カリキュラムの中でグループでアイデアを出して企画を練る時間があります。

そこで「より効果的なアイデア出し」を学生さんに体験してもらうために、「ブレインストーミング」について調べていたら、かなり面白いテーマだったので今回少し記事を書きたいと思います。

例えば我々は何かアイデアを生み出そうとする時、複数人でディスカッションを試みるわけですが、闇雲に議論をしてもなかなかうまくいかず、話し合いが平行線になりやすいのがこの作業の難しいところです。

そもそもブレインストーミング(以下ブレスト)とは、問題を解決するために集団で意見を出し合って、発想の誘発をさせる、発展させていくための手法です。それを効果的に行うために我々が意識しなければならないことって何なのでしょうか?

いろいろ調べていると、NHKで以前放送された「スタンフォード白熱教室」という番組にたどり着きました。今回はこの番組で紹介されていた要素を全て記述することはしませんが、いくつかそこで学んだポイントを書いてみたいと思います。

私が重要だと思った項目は3つです。


1.ブレインストーミングは何のためにする?

ブレインストーミングとは、「あらゆる可能性を探すためにやるもの」です。
ブレインストーミングは、開発とは違います。アイデアを実現するために発生するコストや、その実現性について議論をする段階にはありません。つまり、アイデアの評価を早く始めないことが大切です。

2.Yes,and...(いいね!それに加えて私なら...)の精神

ブレインストーミングは「発想の誘発、発展」を目的としています。
ですので、誰かの意見が出たら、「いいね!私ならそのアイデアに加えてこうしたらいいと思う!」と言うことをルールにするとより良い議論に繋がります。


3.恐れずに、くだらないと思っても発言をたくさんする

一つでも多くのアイデアを出して、アイデアを膨らませていくのが目的なのですから、たくさん発言しなければいけません。グループでアイデアの相乗効果を出すためには、あなた自身が恥ずかしがらずに、積極的に発言しブレインストーミングに参加することが大切です。


以上の3つを意識するだけで、随分と良い議論になると私も思います。
勘違いをしてはいけないのは「否定をしてはいけない」という考え方を持ってしまうことです。

「否定をしてはいけない」と考えていることが、すでに否定を前提で物事を捉えてしまっています。我々はたくさんのアイデアを出し合う中で、アイデアの誘発、発展を狙うわけですから、肯定と付け足し(Yes,and)のコミュニケーションで相乗効果のあるブレストを意識する必要があるというわけなんですね。

以上です。

2013/07/05

ほぼ初めてのiOS開発

後藤です。

ケイフィールドで開発を始めている新サービスについて、私も7月からiOSアプリの開発に現在着手しています。
私は入社の3年前ごろにケイフィールドのインターンシップに参加しており、その際にObjective-Cを経験していて初めてではないはずなのですが、メソッドの書き方とか、プロパティの定義の仕方とか、覚えていないものですね。 しかも、当時はまだストーリーボードがなかったので、色々とやり方がわからず まるっきり初心者のように、毎日エラーにぶつかっては調べて先輩方に聞いて…を繰り返しています。

今回は開発中に出遭ったエラーについて書こうと思います。
// 発生原因等について具体的に分かっていない部分もありますが、ご容赦ください。もし分かるものがあれば、ご教授いただけますと幸いです。

■ TableViewを利用していてcellForRowAtIndexPathメソッドでcellがnilのまま何も入らずエラーが出る

今のバージョンだと、cellがnilの場合は自動的に何か入るとのことですが、何らかの原因によりそれが入らずエラーになってしまっているのではないかという話になりました。
その時の対策としては、UITableViewControllerのサブクラスでObjective-Cファイルを作成した際に自動的に実装ファイルに追加されているcellForRowAtIndexPathメソッドの中へ、以下のif文を追加するとうまくいきました。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if ( cell == nil ) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    return cell;
}
ただ、今同じ状況を再現しようとしたらうまく動いてしまってできませんでした。後述するのですが一度iOSシュミレータやらプロジェクトのファイルやらを全部削除して実行してみたら様々な不具合が直ったので、これもそのせいだったのかもしれません。
また、最初にcellの定義を行なっている部分で、引数にindexPathが入ったままだとうまくいかないこともあったのですが、それも今はうまく動いてしまい原因がわかりませんでした。


■ ちゃんとセグエを作ってるのに ないというエラーが出る

ちゃんとセグエはViewからViewにつないだ、セグエのIdentifierもちゃんと設定している、コードの方もコピペしてIdentifierは一字一句間違いない、のに どうしてもずっとNSInvalidArgumentExceptionが出て消えませんでした。Receiver has no segue with identifierといっていますが、ちゃんとあるんですけど…と思いながらそこそこ長い時間戦いました。
このreasonの部分を検索しても英語のしか出てこないし(もちろん頑張って読みましたが、どれも具体的な解決策は出ていませんでした)、先輩たちにもお聞きしたものの理由は見つからず、どうしたものかと思っていたのですが…。

少し前にも同じことを行っていたのでダメ元で、とiOSシュミレータを初期化しプロジェクトのファイルも一旦削除してからリポジトリのものを戻してきたら、なぜかちゃんと動くようになりました。
もともと、今井さんのところではちゃんと表示されているのに私のところではセルのラベルが表示されないというような不具合もあったのですが、それも全部解消しました。何が原因だったのかは未だにわかりませんが、もっと早く試していれば…と思いました。

追記: 同じような(ストーリーボードもコードもちゃんとなっているのになぜか反映されない)事象が再び起こりましたが、その際はiOSシュミレータのアプリデータを削除することですぐに解決しました。なぜかちゃんとビルドしたものが反映されないことがあるみたいですね。。


すぐ解決した簡単なエラーを除けばこんな感じです。

今はiOSもかなりメジャーになり日本語の解説サイトさんなども増えてきましたが、それでも「開発者ならこれくらい分かって当然」なのか、「一々誰かのために書くのは面倒だから」なのか、エラーと対策などを書いてくださってるサイトってまだ少ないですよね。(もちろん、英語でもスラスラ理解できるようにはなりたいんですが…)
そういった、日本語の情報を求めている人に有益なことをかけるように、なりたいものです。今回のは原因とかが分からず役に立ちそうもないですが、まだまだこれからということで。。

以上、後藤でした。



2013/07/01

最近のケイフィールド

後藤です。

最近の2013年入社新入社員である私や中島さんは、新サービスの企画書作りやJBossのサンプルを利用した実習などを行なっています。

今回は、技術的なことではなく最近のケイフィールドでの流行について書こうと思います。
ケイフィールドで流行っているもの、それは 油そば です。最近 今池の駅にできた歌志軒というお店です。社長を中心に毎日のように通いつめています。

油そば、あまりメジャーなものではないので食べたことがない方も多いのではないでしょうか。私も今回が初めてでした。社長や今井さんの話によると、ラー油と酢をかけて食べる…そうでしたが、私はラー油も酢も苦手なのでドキドキしながら食べにいきました。

紹介するからには当然なのですが、美味しいです。ラー油+酢というとあまり味が想像しにくいと思いますが、説明しがたい味です。辛いというほど辛くもなく、酸っぱくもなく…。汁はなく、ノーマルでは麺+メンマ・チャーシュー・白ねぎ・きざみのりというシンプルな感じで頂くことになります。
が、トッピングの種類がたくさんあり、私たちはもっぱら何かトッピングをプラスして頂いてます。私も昨日2回目を食べに行ったのですが、そのときは麺大盛り(大盛り無料です、すすめられて…)+魚粉で頂きました。

名古屋を中心に営業しているチェーン店だそうです。興味を持たれた方はぜひ試してみてはいかがでしょうか。