たまたんのぶろぐ

たまたんが時たま言いたいことを書いてます。ジャンルはめっちゃええ加減ですwソフトやプログラムのことが多いかもしれませんが。。。。。

iOSでZXingObjC!!for CocoaPods

※ 古いソースをアレンジしたものからのアップグレードだったので、不具合があったようです。新規で使うときは、GithubのZXingObjCを直接サンプルを見ていただく方がいいでしょう<m(__)m>

 

前回は、Androidだったけど、今回は、(_´Д`) アイーンOS

 

・・・・・・。iOSです。。。。。はい。

 

だいぶん前からやっててようやくエラーの対処が出来たんでちょいと披露。

 

てな難しい話じゃないんですけど。

 

バーコードリーダーを使うためにZXingObjCって言うのを使ったんですわ。。。。。。

最初は、普通にgitHubからダウンロードしてきて埋め込んでたんだけど。。。

 

簡単には以下のソース(`・ω・´)

これでバーコードは認識しますのだ。

ちょいと抜粋過ぎなのでアレンジしてくらはい。( ゚∀゚)アハハ八八ノヽノヽノヽノ \ / \/ \

 

ほんで、最近はどこもかしこも定番になったCocoaPodで

入れて楽になったろ〜〜〜〜〜┌┤ ̄ ̄ ̄〜〜〜 ̄ ̄ ̄├┘

って思って、導入したら!!

 

ZXCapture.cで。。。。。。

f:id:tama-jp:20150110201022p:plain

 

「あ"?エラーでるやんけぇ〜( ̄△ ̄)」

 

って、なりました。。。。。。

おどれら!!けんかうってんのけぇ〜〜〜〜 (▼⊿▼) ケッ!

 

おいおいおいおいいぃぃっぃぃぃ。。。。。

 

っで、ちゃんと調べてみたら、、、、、 

 え〜〜〜〜〜〜〜〜〜っと、わからんw

 

とりあえず、dispatchがなんかおかしいかと思い。

コメントアウトした

f:id:tama-jp:20150110202205p:plain

 ら、、、、、動いた(゜ロ゜屮)屮

うーん。

dispatch_get_global_queueってスレッドにで、

並行処理をするようにしてるんだろうけど、

なんでこんなところでエラーが出るのかなぁ。。。。。

 

元々のエラー内容は。

*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** AVCaptureSession can't startRunning between calls to beginConfiguration / commitConfiguration'

 

超ええ加減な訳するとAVCaptureSessionが動いてへんからうまくいかんねんって、言われました。

 

うーむ。どこでエラーになっているのかを細かく調査してみたら

デリゲートでエラーになっている模様。。。。

 

要するに、AVCaptureSessionが生成されてもいないのに外枠に戻すようなことを

設定したので、変に戻ってきたってたことなのか(わたしゃなにいってんだろぉw)

まぁ、とりあえず、以下のようになおしたら動くことが出来たので安心っす。( =̴̶̷̤̄ .̫ =̴̶̷̤̄ )

 ふっ、なんとかブログらしき情報になったε-(´∀`*)ホッ

 

 次回は何書こうかすっごく悩み中。。。。。(V)o¥o(V)ふぉふぉふぉ

UITableViewをアコーディオンっぽくする方法(簡易版)

またまた投稿!!\(^-^)/バンザーイ、/( )\モヒトツ\(^o^)/バンザーイ

 

今回も、またまた、iOSですなのだ!!

 

一時期、UITableViewのアコーディオンが流行りましたが、

そん時は全く興味がなかったのでスルーしてましたw

 

今、ちょうど、自作アプリを作っている最中に、オープンソースとかで簡単に作れるようなのないかなぁって、見てみたら、表示ばかりを気にするものが多く、自分で装飾を変えるのがめんどくさそうなのばかりでした。だから、自作しようかと思い、多階層を作る前に簡単な2階層までのアコーディオンを作ってみました。

 

まぁ、当たり前のソースなんでだれでも、作れるとは思いますがね。

ミソは、カテゴリを作るところだけですので、

説明せんでもわかるでしょうから今回はソースだけです。w

 

 動作はこんなんになります。

 

 

ではでは。<(_ _)>

 

 

Objective-CでCSVをプロパティリストに変換する方法

珍しく2日連続で投稿w

 

昨日、Cocoa勉強会関西ビギナーズに参加してきました。

おまえビギナーだったんかいって突っ込まれそうですが、いつも心は初心者です。( ー`дー´)キリッ

それは冗談で、難しいことは教えられないですが、

初心者の方に教える力はありますので、参加させていただいております。(⌒〜⌒)ニンマリ

それで、その時に、CSVXMLからplist(プロパティリスト)に変換する方法はないかと聞かれました。

 

そもそも、plistは、XML形式になっていています。

Appleが設定しているDTDにしたがって作られています。

詳しくは、

Property List Programming Guide: Introduction to Property Lists

を参照してください。英語だけどね。。。

plistには、形式がいろいろありまして、

配列型、辞書型、文字列型、データ型、日付型、整数型、浮動小数点数型、ブーリアン型(YES/NO)があります。

今回は、配列と辞書型を変換するようにしてみます。

 

また、CSVは、カンマ区切りでやってみます。(ダブルコート「"」を使用したものとそうでないものとを扱います。)

 

ちなみに、Objective-C(NSObject)には、plistへシリアライズ化するものがあるので、簡単に変換できるようになっています。(参照

 

それを使ってプログラムを書いてみます。

小さいプログラムを作るので、ちょっと冗長なところはあるかもしれませんが、

勘弁してくらはい。<m(__)m>

ソースは、自由に使ってかまいませんが、

出来れば、Webサイトの紹介をしていただければありがたいです。<(_ _)>

 

まずは、単なるカンマ区切りのCSVを変化するプログラム

単に、1行ずつ読み込んで

行を「,」で分割して順番に辞書にほりこんでいきます。

そしてそれを配列に突っ込んで、後はシリアライズ化!!

どう?かんたんでしょ?

でもこれだと、カンマが入った文章中にのCSVだと、少々難しくなるので、

正規表現でカンマの位置を取得して、

順番にカンマ位置までのワードを取り出していき、「"」がついていたらトリムするようにしてます。

 こんな感じですね。

後者のテストデータと実行後の出力データをのしておきます。

test.csv

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

test1,test2,test3,test4,test5

あ,い,う,え,お

か,き,く,け,こ

"さ","し","す","せ,","そ"

た,ち,つ,て,と

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

test.plist

f:id:tama-jp:20140223103247p:plain

 

ちょいと、後者は難しかったかもしれないなぁ。。。。

 

NSDataを16進数の文字列に出力する関数

久しぶりに投稿。

 

NSDataを16進数の文字列に出力する関数。(ARC用)

 

- (NSString*) serializeDeviceToken:(NSData*) deviceToken

{

    NSMutableString *str = [NSMutableStringstringWithCapacity:64];

    int length = [deviceToken length];

    char *bytes = malloc(sizeof(char) * length);

    

    [deviceToken getBytes:bytes length:length];

    

    for (int i = 0; i < length; i++)

    {

    [str appendFormat:@"%02.2hhX", bytes[i]];

    }

    free(bytes);

    

    return str;

}

 

または、NSDataのカテゴリーに追加

<NSData+Hex.h>

@interface NSData (Hex)

- (NSString*)hexString ;

@end

 

<NSData+Hex.m>

#import "NSData+Hex.h"

 

@implementation NSData (Hex)

- (NSString*)hexString {

    unichar* hexChars = (unichar*)malloc(sizeof(unichar) * (self.length*2));

    unsignedchar* bytes = (unsignedchar*)self.bytes;

    for (NSUInteger i = 0; i < self.length; i++) {

        unichar c = bytes[i] / 16;

        if (c < 10) c += '0';

        else c += 'a' - 10;

        hexChars[i*2] = c;

        c = bytes[i] % 16;

        if (c < 10) c += '0';

        else c += 'a' - 10;

        hexChars[i*2+1] = c;

    }

    NSString* retVal = [[NSString alloc] initWithCharactersNoCopy:hexChars

                                                           length:self.length*2

                                                     freeWhenDone:YES];

    return retVal ;

}

@end

 

必要だったからメモした。((φ┫ ̄Д ̄ ┣ ホォホォ

AppCodeの初期設定

久しぶりの投稿かな?

PHPStormやWebStormでも有名なJetBrainsのObjective-C用のIDEの私が使用している「AppCode」。

デフォルトだとちょいと使いにくいので設定の変更のメモ。

JetBrains製だとたぶんどれでも使えるはず。まだ試してないけど。

 

0.設定画面の出し方(mac)

コマンド + ,

 

1.行番号を表示する方法

「show line number」で検索してから、Editor→Appearanceと選択し、フォーカスされたチェックボックスをチェックする

 

2.エディタのタブの表示を1行で行う設定を解除する

「Show tabs single row」で検索してから、フォーカスされたチェックボックスを外す。

 

3.エディタのタブの表示のリミット数を増やす。

「tab limit」で検索してから、テキストボックスの数字を多くする。

(100ぐらいにしときゃそうそう、リミットは超えないですw)

 

4.スペースを表示する

「show whitespace」で検索してから、Editor→Appearanceと選択すれば、設定項目がハイライトされています。

 

5.行末尾のキャレット配置を無効にする方法

「Allow placement of caret after end of line」で検索してから、フォーカスされたチェックボックスを外す。

 

そろそろ、本格的にプログラム組まなきゃなぁ。。。。

GPS使用時の初期化判断の方法

 

メモ代わりに書いておきます。

 

GPSを使用するときに大半のサイトでは、

 

    locationServicesEnabled = [CLLocationManager locationServicesEnabled];

    

    if (locationServicesEnabled == nil){

     <初期化>

    ・

    ・

    ・

        

    }

と書かれてます。

しかし、iOS4から非推奨にされているlocationServicesEnabledを使用されています。

なので、これを使用するとXcodeでは、ワーニングがでます。

 

ですので、以下の方法に変更します。

    CLLocation *loc = mapView.userLocation.location;

    

    if (loc == nil){

     <初期化>

    ・

    ・

    ・

        

    }

 
これで出来ると思います。

 

以上。間違ってたらごめんなさい。

 

初心者向けのStoryBoardの画面遷移の説明についてちょっと疑問。

ドットインストールさんの#10 セグエで画面を接続するを見てみました。

 

これはあかんやろぉ〜・・・・

 

確かに画面遷移でトグルができる様にみえるんですが、

初心者にこれは簡単だからといって注意事項を書かなくて

話すのはかなり問題はありますね。

 

これって、画面遷移をしているように思うのですが、

モーダルで画面遷移と言うことは、

画面の切り替えが行われているのではなくて、

最前面に新しい画面が作成されていきます。

 

っと言うことは、ボタンを押すたびに新しい画面が

作成されていくのですからメモリがどんどん消費されていきますよね。

理論をちゃんと説明しておかないと勘違いされますよね。

 

 

指摘しようと思ったんですが、このサイトのどこに言えばいいのかな?>_<

 

 

あっ、勘違いしないでくださいね。

 

 

 

 

プログラムの方法が間違っているわけではないのですよ。

ただ、制限をなしで使用したりするのはまずいです。

要するに、勉強するサイトなのですから注釈が必要だと言っております。

 

 

 

 

 

動作するからいいじゃん!!って言う人もいるかもしれないですが、

理論がわかっていないとあとからどえらい致命的なバグにぶつかるときがあります。

趣味で作って分でしたらいいんですが、BtoCやBtoBで作り出したら責任問題に発展しますよ。

 

最近、ネットで日本語で紹介しているサイトの大半は、理論ではなくて試行錯誤でこうなったとしか書いていないのが多いと思います。

これはこれでいいのですが、使うときには、本当にこれを使用しても問題ないかを

考えた上で使ってくださいね。

 

っと、書いておきましたが、当サイトの技術もよく考えてからご使用くださいw( ̄∇ ̄)

もし間違いがあればどんどん指摘してくださいねぇm(__)m

 

ではでは。