UITextView 初期表示で、先頭行が表示されない
目的のtextViewがAutoLayoutの対象になっており、viewDidLoadの後にtextViewの幅を調整するので、スクロールが動いてしまっていたようだ。
なので、レイアウト配置が終わった後のイベントで、スクロール位置を調整することにした。
-(void)viewDidLayoutSubviews{ [super viewDidLayoutSubviews]; [self.txtTView setContentOffset:CGPointZero animated:NO]; }
参考
UITextView が初期表示時に勝手にスクロールする - Qiita
UIViewControllerのライフサイクル - Qiita
アプリ内でのフォームの分割表示
https://developer.apple.com/jp/documentation/ViewPG_iPhoneOS.pdf
【Swift】UISplitViewControllerの使い方。画面遷移(マスター部とディテーブル部) | はじはじアプリ体験記
iOS8から変更になったUISplitViewControllerについて調べてみた - Qiita
ポップオーバーについて
Using the PopoverView in iPad App Development - mobiForge
UIPopoverControllerを使ってみる : てるてる坊主
UIPopoverController
[XCODE] iPad専用のPopOverControllerを使ってみた - YoheiM .NET
ios-demo/iPad_PopoverView at master · cokecoffe/ios-demo · GitHub
Popoverの実装方法に関して、従来使っていたUIPopoverControllerクラスがiOS9で廃止予定とされました。
GitHub - hsylife/HowToDisplayPopover: To compare the two ways how to implement popover
Swiftでテキストフィールドにピッカーを設定しリスト選択する(コンボボックス的な) - Qiita
NSComboBox は iosでは使用不可
UIPickerView を使う必要がある
UITableViewのイベントが正しく動かない
UITableView がタップされた時のイベントdidSelectRowAtIndexPath で UIAlertController 関連のイベントが正しく動作しなかった。
dispatch_after 、dispatch_async などから、別スレッドを起こして、を使うパターンをためしたけど、うまくいかない。
自分は、タイマーを使ったらうまくできた。
//TableViewがタップされた時のイベント - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ // タイマーを作成してスタート NSTimer *tm = [NSTimer scheduledTimerWithTimeInterval:0.01f target:self selector:@selector(func1:) userInfo:nil repeats:NO ]; } -(void) func1:(NSTimer*)timer{ NSIndexPath* indexpath = [self.tableView indexPathForSelectedRow]; NSString* message =[NSString stringWithFormat:@"%zd" ,indexpath.row ]; }
参考
スレッドプログライミング
https://developer.apple.com/jp/documentation/Multithreading.pdf
フォーマット指定子 書式指定子
NSInteger は、"%zd"
NSUInteger は、"%tu"
16進数 は、”%tx”
NSInteger i = 1234; NSLog(@"i=%zd",i);
参考
http://d.hatena.ne.jp/tanaponchikidun/20120612/1339509661
http://decomo.info/wiki/programming/mac/nsstring_format_specifiers
ファイル出力(追記 append)
NSString* folder = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES)[0]; NSString* filePath = [NSString stringWithFormat:@"%@/out.txt",folder ];
//ファイル名の取り出し NSString* folderName = [filePath lastPathComponent]; //ファル名の取り出し NSString* FileName = [filePath stringByDeletingLastPathComponent]; NSFileManager *fileManager = [NSFileManager defaultManager]; NSError* error; //ファイルの有無の確認 BOOL result = [fileManager fileExistsAtPath:filePath]; if(!result){ BOOL success; //フォルダを作成 success = [fileManager createDirectoryAtPath:folderName withIntermediateDirectories:YES attributes:nil error:&error]; //ゼロバイトのファイルを作成 success = [fileManager createFileAtPath:filePath contents:nil attributes:nil]; } //ファイルの追記 NSString* rec = @"aaaaaaaaaaaaaaaa\n"; @synchronized (self) { NSFileHandle *fh = [NSFileHandle fileHandleForWritingAtPath:filePath]; [fh seekToEndOfFile]; NSData *data = [rec dataUsingEncoding:NSUTF8StringEncoding]; [fh writeData:data]; [fh closeFile]; }
参考
http://www.deftrash.com/blog/archives/2010/10/iphone_file_append.html
http://buchi.hatenablog.com/entry/2014/09/08/155919
UIAlertController 同期処理
UIAlertController を使用した際の同期処理がうまくできない。
セマホを使っても、元々メインスレッド上で処理されているらしく、wait待ちすると、ポップアップすら止まってしまう。
どうも VBでいうところの、DoEvents方式しかないようだ。
.... [view presentViewController:alertController animated:YES completion:nil]; while (! finished) { // 0.5秒間隔で、finishedしているか、確認しがなら待地合わせる。 [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]]; }
NSError の使い方
呼ばれる側
+ (BOOL)testMethod error:(NSError**)error{ __block NSError* responsError = nil; __block NSInteger httpStatus = 0; NSURLSessionDataTask* task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { responsError =error; httpStatus = ((NSHTTPURLResponse* )response).statusCode; }]; if (responsError){ *error =responsError; return NO; }else if (httpStatus == 200){ error=nil; return YES; }else{ NSDictionary *errorUserInfo = @{NSLocalizedDescriptionKey: @"upLoadで失敗しました", NSLocalizedFailureReasonErrorKey: @"HTTPコードが200以外"}; *error = [[NSError alloc] initWithDomain:@"testMethod" code:httpStatus userInfo:errorUserInfo]; return NO; } }
呼ぶ側
NSError* error = nil; BOOL rtn = [testMethod error:&error]; if (! rtn) { NSLog(@"%@",error); NSLog(@"%@",error.localizedDescription); NSLog(@"%@",error.localizedFailureReason); }
NSLocalizedDescriptionKey で設定した内容は、error.localizedDescriptionで取得できる。
NSLocalizedFailureReasonErrorKey で設定した内容は、error.localizedFailureReason で取得できる。