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の2つの実装方法を比較する - Qiita

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 で取得できる。