信頼はずっと、挑戦はもっと。

お問い合わせ
TEL:03-3496-3888

BLOG コアテックの社員ブログ (毎週月曜~金曜更新中)

LIST OF ARTICLES

記事一覧

  • テクログ

    Objective-C | 非同期通信 簡単バージョン

    Mac,iPhone,Objective-C 全て利用歴6ヶ月の新米プログラマーが送る 自分が使って役立ったmethod&Tips;集 シリーズ第12弾です。 今回は開始1ヶ月目くらいで挑戦した非同期通信についてです。 画面に表示するような動的部分が無いとは言えいきなり挑戦するなんて無謀でした。 しかし、始めたばかりで無謀かどうかの判断すら付かないのであちこち調べました。 当時ライブラリがあることすら知らなかったのですが、今なら AFNetworking, ASIHTTPRequest 当たりを調べて使いますねキット。 完成したのがこの簡単バージョン よそ様の非同期通信のサンプルは画像持ってくる例が多いのですが、今回はサーバ上にあるphpで処理を行い結果を受け取るという前提です。 非同期通信なのに通信終了まで待ってます。これはサーバーからデータを受け取らないと画面だけ表示しても意味をなさないからです。 ではなぜ、同期通信しないのか。設計は複雑になりますが、これだけ覚えておけばやり方によって同期/非同期どっちも使えるからです。 実際にコーディングした際もデータが取得出来なかったときの処理がやりやすかったです。 というわけで、サーバープログラムから解説 blogasync1.php $_POST['input'],"ret"=>"OK"); $ar[]=array("input"=>$_POST['input'],"ret"=>"OK-2"); } header('Content-Type: application/json; charset=utf-8'); //JSONファイルの出力 echo json_encode($ar, JSON_UNESCAPED_UNICODE); //JSON形式にして返す 続いてiOS側。Xcodeでフォームに配置したボタンをAction接続してあります NSURLConnectionDelegate も利用します 外部ライブラリでくるくる回る画像を利用してます。 https://github.com/samvermette/SVProgressHUD をダウンロードして FinderからSVProgressHUDディレクトリを自分のプロジェクトにポイっと入れて下さい ViewController.h #import  @interface ViewController : UIViewController - (IBAction)async:(id)sender; @end ViewController.m #import "ViewController.h" #import "SVProgressHUD.h" @interface ViewController (){     NSString       *connectStatus_;     NSMutableData  *mData_;    // json     NSMutableArray *cellList_; } @end @implementation ViewController - (void)viewDidLoad {     [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)didReceiveMemoryWarning {     [super didReceiveMemoryWarning];     // Dispose of any resources that can be recreated. } #pragma mark svr connection // 非同期通信でgroup 1record 取得 - (void)getJson {     // 通信中表示     [SVProgressHUD showWithMaskType: SVProgressHUDMaskTypeClear];     connectStatus_ = @"start";     // login id     NSString *query = [NSString stringWithFormat:@"input=%@", @"test-test"];     NSData *queryData = [query dataUsingEncoding:NSUTF8StringEncoding];          // 各自のサーバのURLに置き換えて下さい。     NSString *url = @"http://localhost/blogasync1.php";          NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init];     [request setTimeoutInterval:30]; //タイムアウトを30秒に設定     [request setURL:[NSURL URLWithString:url]];     [request setHTTPMethod:@"POST"];     [request setHTTPBody:queryData];          [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;     [NSURLConnection connectionWithRequest:request delegate:self];     NSLog(@"async connection");          while ([connectStatus_ isEqualToString:@"start"]) {         // while 内で一旦 NSRunLoop へ制御戻してやる。runUntilDateはモードとしてNSDefaultRunLoopModeを用いる         [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]]; //0.5sec     }          if ([connectStatus_ isEqualToString: @"OK"]) {         NSError *error = nil;         //NSDictinaryがNSArrayになって返ってきます(id の中に入る)         id json = [NSJSONSerialization JSONObjectWithData:mData_ options:NSJSONReadingAllowFragments error:&error;];         if(!error) {             if (json == [NSNull null]) {                 return;             }             cellList_     = [NSMutableArray array];             NSUInteger cnt = [json count];             for (int idx=0; idx NSRunLoop を利用して通信待ちを行っています。ちょっとしたやりとりならこれで十分だと思います。 connection:シリーズは毎回同じなのでひとまとめにしておくとあとで使い回しするときに便利です。 他のがっつりした取り方は次回解説します。 序盤すぎて覚えてませんが、たぶん参考にしたのはここだと思います ■バリューアークコンサルティング株式会社NSURLConnectionとNSJSONSerializationを使用してjsonをパースする   ■YoheiM.NET[XCODE] iPhoneアプリからHTTPリクエストを送信して、データを受信する方法   そのほかのObjective-C関連の記事をお探しならコチラをどうぞ
  • テクログ

    Objective-C | UICollectionViewを引っ張って更新

    Mac,iPhone,Objective-C 全て利用歴6ヶ月の新米プログラマーが送る 自分が使って役立ったmethod&Tips;集 シリーズ第11弾です。 リストを引っ張ったらくるくるして更新するやつをやってみます。 TeamScheduler のグループ画面にもこっそり導入されております。 UITableViewでやるのが普通なんでしょうが、今回はUICollectionViewでCellの色がランダムで変わるようにします。 一部methodが違うだけで特に違いはありません。 cellForItemAtIndexPath / forRowAtIndexPathの様にUICollectionViewは○○Item、UITableViewは○○Rowです。 事前準備として 新しいフォームにUICollectionViewを置いて、その上にUICollectionViewCellを4つ置きます。 UICollectionViewは高さがあるとスクロール出来ないので、高さをあらかじめ短くしておきます。 UICollectionViewCellのidentifierにcell1~cell4までそれぞれ名前を付けておきます。 やっとプログラムの説明 ViewController.h UICollectionView をoutlet接続して、DataSourceとDelegateの使用を宣言してあります #import  @interface ViewController : UIViewController @property (weak, nonatomic) IBOutlet UICollectionView *collectionView; @end ViewController.m #import "ViewController.h" @interface ViewController () @end @implementation ViewController BOOL nameflag = YES; - (void)viewDidLoad {     [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib.          // initialize     [_collectionView setDataSource:self];     [_collectionView setDelegate:self];     // 引っ張って更新     UIRefreshControl *refreshControl = [[UIRefreshControl alloc]init];     // 更新アクションを設定     [refreshControl addTarget:self action:@selector(pullDown:) forControlEvents:UIControlEventValueChanged];          // UICollectionViewControllerにUIRefreshControlをadd     [_collectionView addSubview:refreshControl];     [_collectionView reloadData]; } - (void)didReceiveMemoryWarning {     [super didReceiveMemoryWarning];     // Dispose of any resources that can be recreated. } #pragma mark -collection view - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {     return 1; } // 各セクションの項目数 -(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {     return 4; } //Method to create cell at index path -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{     NSInteger row = indexPath.row;          UICollectionViewCell *cell = nil;          NSString *cellname = [NSString stringWithFormat:@"cell%d", row+1];     cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellname forIndexPath:indexPath];     cell.backgroundColor = [self randomColor];     return cell; } #pragma mark -action -(void) pullDown:(id)sender {     [sender beginRefreshing];     [_collectionView reloadData];     [sender endRefreshing]; } - (UIColor *)randomColor {     static NSArray *selectColor = nil;     static dispatch_once_t onceToken;     dispatch_once(&onceToken;, ^{         selectColor = @[                     [UIColor blueColor],                     [UIColor redColor],                     [UIColor greenColor],                     [UIColor yellowColor],                     [UIColor orangeColor],                     [UIColor purpleColor],                     [UIColor lightGrayColor],                     ];     });          NSInteger randIdx = arc4random() % selectColor.count;     return selectColor[randIdx]; } @end 自前でUICollectionViewをセットしてるので、表示用のコードも自前で用意しますUITableViewと必要な物は同じです。名前がちょっと違うだけ 例では、reloadDataを行うだけですが、画像を新規に読み直すとか並び順変える等使えると思います。 参考にさせていただいたサイトです ■Qiita iOS - UIRefreshControlで引っ張って更新をする そのほかのObjective-C関連の記事をお探しならコチラをどうぞ   今回も宣伝しておしまいにします。   弊社から出している拙作スケジュールのアプリです。 スケジュールというかちょっとした予定を入力して、社長、同僚、家族がどこ行った??っていうときに第三者が確認するためのアプリです 是非ダウンロードして感想をお聞かせ下さい。 『Team Scheduler』 概要 ▼アプリ価格: 無料 ▼対応OS: iOS(iPhone/iPod Touch)、Android ▼カテゴリ: 仕事効率化(App Store)、ビジネス(Google Play) ▼対応言語: 日本語 ▼推奨環境:  iOS版: iPhone4以降、iOS6. 0以降  Android版: Android OS 2. 3以降 ▼ダウンロード:    
  • テクログ

    Objective-C | 一週間の開始と終了日を取得

    Mac,iPhone,Objective-C 全て利用歴5ヶ月の新米プログラマーが送る 自分が使って役立ったmethod集 シリーズ第10弾です。 渡された週の真ん中の日付を渡すと週の開始と終了日を持ってきます。 開始は日曜日、終了は土曜日と定義しており、1日が日曜日の場合、終了日である土曜は7日となります。 日付の扱い方がいろいろあって何がいいのかわからなくて四苦八苦した記憶があります。 これが正解かどうかは不明ですがニッチな分、他でやってないって事でよしとしましょう。 common.h + (NSArray *)getDaysOfCurrentWeek:(NSDate *)weekDate; common.m // 一週間の開始と終了日 // return NSDate array + (NSArray *)getDaysOfCurrentWeek:(NSDate *)weekDate {     NSCalendar *calendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];     // Create the start date components     NSDateComponents *oneDayAgoComponents = [[NSDateComponents alloc] init];          // 週の連番 日曜が1土曜が7     // Get the weekday component of the current date     NSDateComponents* subcomponent = [calendar components:NSWeekdayCalendarUnit fromDate:weekDate];          /*      Create a date components to represent the number of days to subtract from the current date.      The weekday value for Sunday in the Gregorian calendar is 1, so subtract 1 from the number of days to subtract from the date in question.  (If today is Sunday, subtract 0 days.)      */          [oneDayAgoComponents setDay: 0 - ([subcomponent weekday] - 1)];          NSDate *beginningOfWeek = [calendar dateByAddingComponents:oneDayAgoComponents toDate:weekDate options:0];          //+++++++++++++++++++ end week+++++++++++++++     [oneDayAgoComponents setDay:7- ([subcomponent weekday])];          NSDate *endOfWeek = [calendar dateByAddingComponents:oneDayAgoComponents                                                   toDate:weekDate options:0];     return (NSArray *)@[beginningOfWeek, endOfWeek]; } 呼び出し方 ViewController.h に修正はありません。 #import "ViewController.h" #import "common.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {     [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib.          // 2ヶ月前     NSDate *today = [NSDate date];     //    NSCalendar *cal = [NSCalendar currentCalendar];     NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];          NSDateComponents *comps = [[NSDateComponents alloc] init];     [comps setMonth:-2];     NSDate *date = [cal dateByAddingComponents:comps toDate:today options:0];     NSArray *prev     = [common getDaysOfCurrentWeek:date];     //NSDate *startDate = [common stringToDate:prev[0]];     //NSDate *startDate = prev[0];          NSLog(@"%@", prev);      } - (void)didReceiveMemoryWarning {     [super didReceiveMemoryWarning];     // Dispose of any resources that can be recreated. } @end 実行結果 (     "2014-03-23 10:56:00 +0000",     "2014-03-29 10:56:00 +0000" ) getDaysOfCurrentWeek:(NSDate *)weekDate の戻り値が NSArrayになっていて 特殊な戻し方をしているのがミソとなっております 以前に作成した stringToDate:baseString を利用すると、日付だけの文字列に変換出来ます。 Objective-C / 日にちの文字列を 日付(NSDate)型に変換   参考にさせていただいたサイトです ■stackoverflow Display week & day lists for everymonth when we pass the year ■Mac Developer Library Performing Calendar Calculations ■プロフェッショナルプログラマー NSDate, NSDateComponents でiOSの時間を制する(その2) そのほかのObjective-C関連の記事をお探しならコチラをどうぞ   弊社から出している拙作スケジュールのアプリです。 スケジュールというかちょっとした予定を入力して、社長、同僚、家族がどこ行った??っていうときに第三者が確認するためのアプリです 是非ダウンロードして感想をお聞かせ下さい。 『Team Scheduler』 概要 ▼アプリ価格: 無料 ▼対応OS: iOS(iPhone/iPod Touch)、Android ▼カテゴリ: 仕事効率化(App Store)、ビジネス(Google Play) ▼対応言語: 日本語 ▼推奨環境:  iOS版: iPhone4以降、iOS6. 0以降  Android版: Android OS 2. 3以降 ▼ダウンロード:    
  • テクログ

    Objective-C | 年月日時分秒の文字列を 日付(NSDate)型に変換

    Mac,iPhone,Objective-C 全て利用歴5ヶ月の新米プログラマーが送る 自分が使って役立ったmethod集 シリーズ第九弾です。 文字列変換、時分秒バージョン。フォーマット引数を用意して任意にしてもよかったのですが、 今回2パターンしか使わなかったので分けました。 common.h + (NSDate *)stringToDateTime:(NSString *)baseString; common.m + (NSDate *)stringToDateTime:(NSString *)baseString {     NSDateFormatter *inputDateFormatter = [[NSDateFormatter alloc] init];     //24時間表示 & iPhoneの現在の設定に合わせる     [inputDateFormatter setLocale:[NSLocale currentLocale]];          [inputDateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];     NSDate *inputDate = [inputDateFormatter dateFromString:baseString];          return inputDate; } 呼び出し方 ViewController.h に修正はありません。 #import "ViewController.h" #import "common.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {     [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib.     NSDate *dateVal = [common stringToDateTime:@"2014-05-22 15:26:37"];     NSLog(@"%@",dateVal); } - (void)didReceiveMemoryWarning {     [super didReceiveMemoryWarning];     // Dispose of any resources that can be recreated. } @end 実行結果 2014-05-22 06:26:37 +0000 呼び出す方は + (NSDate *)stringToDate:(NSString *)baseStringで設定しているフォーマットつまり、"yyyy-MM-dd HH:mm:ss"形式じゃ無いとうまく変換され無いので注意が必要です。"yyyy/MM/dd"は結果が正しく取得出来ません。 普段使うフォーマットが違う場合は書き換えておくといちいち変換しなくていいので便利です。 実行結果時間が違うのは以前と同じく Gregorianで表示しているからで、 画面に表示するときにはlocaltimeに変換されます。   参考にさせていただいたサイトです 強火で進め そのほかのObjective-C関連の記事をお探しならコチラをどうぞ 弊社から出している拙作スケジュールのアプリです。 スケジュールというかちょっとした予定を入力して、社長、同僚、家族がどこ行った??っていうときに第三者が確認するためのアプリです 是非ダウンロードして感想をお聞かせ下さい。 『Team Scheduler』 概要 ▼アプリ価格: 無料 ▼対応OS: iOS(iPhone/iPod Touch)、Android ▼カテゴリ: 仕事効率化(App Store)、ビジネス(Google Play) ▼対応言語: 日本語 ▼推奨環境:  iOS版: iPhone4以降、iOS6. 0以降  Android版: Android OS 2. 3以降 ▼ダウンロード:    
  • テクログ

    Objective-C | 本体に情報を保存する方法

    Mac,iPhone,Objective-C 全て利用歴5ヶ月の新米プログラマーが送る 自分が使って役立ったmethod集 シリーズ第八弾です。 今回はiPhone本体に保存された情報を参照する方法です。パスワードなど重要な情報と普通の情報で保存方法が違うので順番に説明します 保存側がベタで書いてあるのは本体に保存する箇所が一カ所しか無かったのでそのまま使いました。 common.h + (NSString *) getUserDefault:(NSString *)forKey; common.m // ユーザーデフォルトから取得 + (NSString *) getUserDefault:(NSString *)forKey {     NSUserDefaults *myDefaults = [NSUserDefaults standardUserDefaults];     NSString *ret = [myDefaults objectForKey:forKey];     return ret; } 呼び出し方 ViewController.h に修正はありません。 ViewController.m #import "ViewController.h" #import "common.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {     [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib.     // 値保存     NSUserDefaults *myDefaults = [NSUserDefaults standardUserDefaults];     [myDefaults setObject:@"hozon" forKey:@"mydata"];          // ユーザーデフォルト     NSString *mydata = [common getUserDefault:@"mydata"];     NSLog(@"mydata= %@", mydata); } - (void)didReceiveMemoryWarning {     [super didReceiveMemoryWarning];     // Dispose of any resources that can be recreated. } @end 実行結果 2014-05-20 20:18:59.376 test[1561:60b] mydata= hozon パスワードなど秘密にしたい情報は、 Keychain Service が推奨となっています。 これを自前で用意するとなかなか大変なのですが、いいライブラリがありました。 soffes/sskeychain | GitHub  画面右端スクロールして中ほどにある「Download ZIP」ボタンを押してソースを一式取得します。 ファインダーからSSKeychain.h と SSKeychain.mを自分のプロジェクトにドラッグアンドドロップ なんか聞かれると思うので、Destination: Copy items into ~にチェックをいれて Finish ボタン押下 次にProjectの一番上をクリックして画像の通りチェックし、Linked Frameworks and Librariesの下に有る「+」を押してSecurity.frameworkをAddしておきます。 先ほどのプログラム ViewController.mに #import "SSKeychain.h" 追加して呼び出します ViewController.m #import "ViewController.h" #import "common.h" #import "SSKeychain.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {     [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib.     // 値保存     NSUserDefaults *myDefaults = [NSUserDefaults standardUserDefaults];     [myDefaults setObject:@"hozon" forKey:@"mydata"];          // ユーザーデフォルト     NSString *mydata = [common getUserDefault:@"mydata"];     NSLog(@"mydata= %@", mydata);          //     // Keychain Service に mydataの中身をキーとしてパスワードを保存する     [SSKeychain setPassword:@"securitycode"      forService:@"sampleProject" account:mydata];     // 取り出し     NSString *passCode = [self getPassCode:mydata];     NSLog(@"passCode= %@", passCode); } - (void)didReceiveMemoryWarning {     [super didReceiveMemoryWarning];     // Dispose of any resources that can be recreated. } // パスワードをKeychain Serviceから取得 - (NSString *) getPassCode:(NSString *)myid {     NSString *pass = [SSKeychain passwordForService:@"sampleProject" account:myid];     return pass; } @end 実行結果 2014-05-20 20:45:37.071 test[1561:60b] mydata= hozon 2014-05-20 20:45:37.071 test[1561:60b] passCode= securitycode そのほかのObjective-C関連の記事をお探しならコチラをどうぞ 弊社から出している拙作スケジュールのアプリです。 スケジュールというかちょっとした予定を入力して、社長、同僚、家族がどこ行った??っていうときに第三者が確認するためのアプリです 是非ダウンロードして感想をお聞かせ下さい。 『Team Scheduler』 概要 ▼アプリ価格: 無料 ▼対応OS: iOS(iPhone/iPod Touch)、Android ▼カテゴリ: 仕事効率化(App Store)、ビジネス(Google Play) ▼対応言語: 日本語 ▼推奨環境:  iOS版: iPhone4以降、iOS6. 0以降  Android版: Android OS 2. 3以降 ▼ダウンロード:    
  • テクログ

    Objective-C | 複数行のUILabelの行間を変える

    Mac,iPhone,Objective-C 全て利用歴5ヶ月の新米プログラマーが送る 自分が使って役立ったmethod?集 シリーズ第七弾です。 前回のUILabelの高さを動的に変えるために複数行入力した際に行数に合わせて枠が伸びるようにしたあと、さらに行の隙間を調整したい時にどうぞ。 common.h + (void)labelSpacing:(UILabel *)label height:(float)height inText:(NSString *)inText; common.m // 複数行あるUILable の高さを変更 + (void)labelSpacing:(UILabel *)label height:(float)height inText:(NSString *)inText {     // パラグラフスタイルにlineHeightをセット     NSMutableParagraphStyle *paragrahStyle = [[NSMutableParagraphStyle alloc] init];     paragrahStyle.minimumLineHeight = height;     paragrahStyle.maximumLineHeight = height;     // NSAttributedStringを生成してパラグラフスタイルをセット     NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] initWithString:inText];     [attributedText addAttribute:NSParagraphStyleAttributeName                            value:paragrahStyle                            range:NSMakeRange(0, attributedText.length)];     label.attributedText = attributedText; } 呼び出し方 ViewController.h に修正はありません。 ViewController.m #import "ViewController.h" //#import "common.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UILabel *label; - (IBAction)labelButton:(id)sender; @end @implementation ViewController - (void)viewDidLoad {     [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib.     //NSString *tmp = [common escapeString:@"テスト&%$?"];     //NSLog(@"テスト&%%$? -> %@",tmp);     _label.text = @"1\n2\n3";     [common labelSpaceing:_labelMemberName height:20.0f inText:_label.text]; } - (void)didReceiveMemoryWarning {     [super didReceiveMemoryWarning];     // Dispose of any resources that can be recreated. } - (IBAction)labelButton:(id)sender {     if ([_label.text isEqual: @"1\n2\n3"]) {         _label.text = @"1\n2";     } else {         _label.text = @"1\n2\n3";     }     [common labelSpaceing:_labelMemberName height:20.0f inText:_label.text]; } @end 実行結果 画像はありませんが、実行するとちょっと空間ができてるはずです。 このサイトのコードを利用させて戴きました。ほとんどまるまる使ってます(;´Д`)他のにも便利な使い方があるので詳しくはコチラをどうぞ Qiita UILabelを使って行間や文字間を簡易的に調整する。 そのほかのObjective-C関連の記事をお探しならコチラをどうぞ 弊社から出している拙作スケジュールのアプリです。 是非ダウンロードして感想をお聞かせ下さい。 『Team Scheduler』 概要 ▼アプリ価格: 無料 ▼対応OS: iOS(iPhone/iPod Touch)、Android ▼カテゴリ: 仕事効率化(App Store)、ビジネス(Google Play) ▼対応言語: 日本語 ▼推奨環境:  iOS版: iPhone4以降、iOS6. 0以降  Android版: Android OS 2. 3以降 ▼ダウンロード: