@neiraza

2匹の怪獣が寝た後にプログラマーしてる、最近はサイバーエージェントでゼミ長もしてる僕のネタ帳

UIAlertViewのdelegateでダラダラすんの禁止

UIAlertViewでok/cancelをタップした後の処理ってどうしてます?

delegateだけで対応すると、
複数のUIAlertView扱っちゃうと、分岐の嵐。

アラートダイアログが消えたら、○○するとかでも良いのかもだけど、
後々、UIKitが対応してくれるとしたら、blockでやってくれるはず。
また既に多くの人が、そーしてるはず。そいうライブラリもあるし。

あとは、カテゴリにしといてくれないと使いづらい。
シンプルにおさめると、こんなんでいいはず。


参考 UIAlertView の delegate 束縛を解放しよう | mixi Engineers' Blog

GMTな文字列をNSDateなローカル時間に変換した

iOSAndroidをいったりきたりしているうちに、
この単純な対応方法を忘れてしまったので書いておく。

そもそも、NSDateのカテゴリとかで残ってないのが不思議なんだけど。
前に作ってた時は、どーしてたんだろか。

基本方針として、
NSStringやNSDateのカテゴリとして作成しておく。

んで、呼び出す以上。

Android Spinnerでkey-valueを使うには?

今日は僕の誕生日なので、誕生日ネタを書くことにした。

皆さんもよく唐突に、誕生日を公開しちゃおっかなーて時があるかもしれない。
そんな時に思うのが、

「せんせーい、たんじょうびって、XXXX年とか入るんですかー?」

って事だとおもう。

画面イメージでいうと、こんな感じ。

f:id:redogu:20130829100350p:plain
iPhone, Androidアプリ「Eyeland」よりAndroid版の画面を拝借
Copyright (c) Oceans Inc. All Rights Reserved.

AndroidだとSpinnerでつくれるやーと思ってたんだけど、
「すべて公開とか」表示している名称と、
名称に紐づけたい区分値の管理の管理の仕方が見つからない。

あれー、そいうの標準で用意してないのかなーと思いつつ、
誕生日だしせっかくなので、作ってみた。

  • FormActivity.java : Spinnerを表示したい画面さん
  • KeyValueAdapter.java : SpinnerにぶっこむAdapterを毎回プライベートに持つのもなんだし
  • SpinnerHelper.java : SpinnerにぶっこむAdapterをarrays.xmlから召還
  • SpinnerObject.java : getter, setterががが
  • arrays.xml : 「表示したい内容」と「表示したい名称と区分値の紐付け」

以下、ソースですけど、
こんなの、もっと簡単に標準で用意してないんすかね
教えてエロい人。

pod installできなくて困っていた件を解決した

気づいたら、こんなことになっていて、、、

> Installing MBProgressHUD (0.7)
 > GitHub download
   $ /usr/local/bin/git config core.bare
   true
   $ /usr/local/bin/git config core.bare
   true
 > Updating cache git repo (/Users/togu/Library/Caches/CocoaPods/GitHub/ef81a51251a828eea52cbd59e57827b0007c9dba)
     $ /usr/local/bin/git remote update
     error: cannot open FETCH_HEAD: Permission denied

[!] Pod::Executable remote update

error: cannot open FETCH_HEAD: Permission denied

言われた通りの場所が、rootになってた
なんでだろー?と思いつつ自分の権限にかえて、pod installで決まり

# ls -l /Users/togu/Library/Caches/CocoaPods/GitHub/ef81a51251a828eea52cbd59e57827b0007c9dba

-rw-r--r--   1 root  staff  6028  8 19 18:54 FETCH_HEAD 

# sudo chown togu:staff

複数のEditTextがジムやボールのようにTextWatcherした

追記:20130731
TextWatcher#onTextChanged(CharSequence s, int start, int before, int count)
このcountて文字数が返ってくるけど、数値を入力すると0 or 1しか返ってこなかった。
s.lenght()の方が良いかなと思い修正。

豆腐になったビグザム

最近、豆腐になってたビグザムさん。

子供の頃から今でも一番好きなMA。
f:id:redogu:20081202065013j:plain

なんで、これが好きかというと、
他者の追随を許さない圧倒的なバランスの悪さが、とても心に響く。

そして、この人、ドズル中将。
cvさんはお亡くなりなってしまっており、もうあの名言が聴けないかと思うと残念。
f:id:redogu:20100119090357j:plain

本題

EditTextが並ぶような入力画面をせっせと作ってて、
あれ?と思ったこと。

EditTextの入力値チェックをやりたいんだけど、
複数のEditTextを同時に対象とすると、良い解決方法がなかた。
もしかしたら、何か標準的なやり方が用意されているのでは?と調べても、考えても思いつかない。

なので、TextWatcherを実装して、こんなの作って解決してみた。
ねー、他に何かないのかな?

汎用的なAlertDialogを用意ついでにDialogFragmentデビュー

AlertDialogを汎用的につくろうと思って、下記を参考にDialogFragmentデビューしてみた。

http://d.hatena.ne.jp/sakura_bird1/20130207/1360193574:DialogFragmentでシンプルで汎用的なダイアログ

イメージ的にはこんな感じだけど、
これだとFragmentが再生成されたときとかに落ちてしまうはず。
ま、それは別の話しなので、そのうち。

https://gist.github.com/neiraza/6076893:neiraza / CommonDialogFragment

UITextFieldの本当の文字数をみてなかた

ほんたったで写経したり、設計書や資料集やらを置いて捗りまくりです。

EDISON ほんたった赤(ハードケース入り)

EDISON ほんたった赤(ハードケース入り)

本題

UITextFieldを2つ、UIButtonを1つの画面を作っていて、
UITextFieldが2つともN文字以上の場合のみ、UIButtonを有効にしたい

こういう時、UITextFieldDelegateを使いますよね。
UITextFieldDelegate Protocol Reference

たぶん、使うのはshouldChangeCharactersInRangeだと思うんですけど、
なんか思い通りにいかなくて。

hogeTextFieldの長さを取得するのに、

int hogeLen = hogeTextField.text.length;

こうしてるんだけど、

1文字入力
hogeLen :0

1文字削除
hogeLen :1

なんでだよーと思ってたら、ようはdelegateで捕まえてきた時の入力前の状態なのね。

というわけで、shouldChangeCharactersInRangeの引数を使って解決。

まとめ

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{    
    NSMutableString *str = [textField.text mutableCopy];
    [str replaceCharactersInRange:range withString:string];

    /*
      * あとはlengthをとって、文字数オーバならNOを返せばいいし、
      * 問題ないなら、そのhogeTextField.selected = YESとかしちゃって、
      * 他UITextFieldのselectedをみつつ、条件が合致すれば、button.enabled でいいかも
      */
 
    return YES;
}