Soupstock

iOSアプリ開発覚書

UIWebViewで読み込みが完了したことを判断する

UIWebViewで読み込みが完了したとき通常webViewDidFinishLoadが呼ばれますが、フレームなどを使用したページではwebViewDidFinishLoadが複数回呼ばれ読み込みが完了したタイミングがわからない場合があります。networkActivityIndicatorVisibleなどを設定する場合に本当に読み込みが完了したタイミングを知りたい場合は以下のようにします。


まずヘッダに読み込み中のプロパティを宣言します

@property (nonatomic) NSInteger webViewLoadingCount;


次に実装ファイルでwebViewDidStartLoadでプロパティをインクリメント、webViewDidFinishLoadとdidFailLoadWithErrorでプロパティをデクリメントします

- (void)webViewDidStartLoad:(UIWebView *)webView {
        self.webViewLoadingCount++;
	[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}

- (void)webViewDidFinishLoad:(UIWebView *)webView {
	self.webViewLoadingCount--;
	if (self.webViewLoadingCount > 0) {
                // Loading
		return;
	}
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

        // Load complete
}

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
	self.webViewLoadingCount--;
	if (self.webViewLoadingCount > 0) {
                // Loading
		return;
	}
	[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

        // Load complete with error
}

補足
最初はUIWebViewのloading(isLoading)プロパティで判断しようとしましたが、読み込み中でもNOが返ってきたりして判断できませんでした。
またJavascriptの実行が完了したかどうかの判定のしかたは不明です:)

Xcodeでソースコードをフォーマット(整形)する

Visual Studioを使っていたときはCtrl+E, Dでインデントや括弧の位置、スペースなどを一発で整形できました。
Xcodeでもフォーマット機能がないか探したところcontrol+iでのインデント整形だけみたいです。
そこで今回はXcodeのプラグインのBBUncrustifyPlugin-Xcodeを使います。

使い方

  1. BBUncrustifyPlugin-Xcodeのページでzipをクリックしソースコードをダウンロードします。
  2. BBUncrustifyPlugin.xcodeprojを開きビルドします。
  3. Xcodeを再起動するとEditメニューにUncrustify ‥が表示されます。
  4. 編集中のソースコードをフォーマットしたい場合はUncrustify Active Fileを実行するとファイル全体がフォーマット(整形)されます。

使用例

before

after

Remote Desktop Connection Client for Mac で接続できない

IPアドレスを入力して接続しようとした場合、フリーズしたようになり、数分後に以下のメッセージが出る場合があります。

「接続先のコンピューターのIDを確認できません。
Windowsベースのコンピューターに再接続してみるか、または管理者に問い合わせてください。」
f:id:soupstock:20130514231047p:plain

RDC -> 環境設定 -> ドメインに何も入力されていないか確認してください。もしIPアドレス等が入っている場合は消去して接続してみてください。

f:id:soupstock:20130514231925p:plain

ちなみにRDCのダウンロードページには
>> Mac OS X v10.7 (Lion) またはそれ以降と使用するものではありません。 <<
とありますが、Mountain Lionでも使えました。

http://www.microsoft.com/japan/mac/download?pid=Mactopia_RDC&fid=68346E0D-44D3-4065-99BB-B664B27EE1F0#viewer

特定のファイルのARCを無効にする

プロジェクトに外部からファイルを追加したりした場合に、ARCに対応していない場合があります。このときretainやreleaseなどを削除してARCに対応させることもできますが修正箇所が多いと大変です。特定のファイルのみARCを無効にしましょう。

手順

プロジェクトを選択してTARGETS -> Build Phases -> Compile Sources と進んで
ARCを無効にしたいファイルをダブルクリックして次のコンパイルオプションを指定します。

-fno-objc-arc

f:id:soupstock:20130419010238p:plain

UITableViewでreloadDataを実行すると選択解除アニメーションがキャンセルされる

下記の操作パターンがよくあると思います。

詳細画面に移動

何かを編集

戻る

reloadData

前の画面に戻ったとき選択したセルがフェードアウトするアニメーションがキャンセルされてしまうので、reloadDataを実行後に選択解除アニメーションを再現させます。

- (void)viewWillAppear:(BOOL)animated
{
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
    [self.tableView reloadData];
    [self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone];
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
    [super viewWillAppear:animated];
}

あまり美しくないですね…。他にいい方法があれば誰か教えて頂けるとうれしいです。

UIWebViewでJavascriptを外部ファイルから読み込んで実行する

テキストエディットなどを使用してjsファイルを用意する

f:id:soupstock:20130409235456p:plain
f:id:soupstock:20130409214220p:plain

jsファイルをプロジェクトに追加する(Add to targetsのチェックを忘れずに)

f:id:soupstock:20130409220955p:plain


プロジェクトのTARGETS -> Build Phasesを開き、Compile SourcesにあるjsファイルをCopy Bundle Resourcesにドラッグして移動させる(拡張子をtxtなどにしておくとこの手順は不要です)

f:id:soupstock:20130409230045p:plain


コード内で外部ファイルを読み込んで実行
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"js"];
NSString *script = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:NULL];
NSString *ret = [self.webView stringByEvaluatingJavaScriptFromString:script];
NSLog(@"%@", ret);

はてなブログでObjective-Cのシンタックスハイライトを使う

設定->編集で「はてな記法モード」に設定後、編集画面で以下のようにコードを記述します。

>|objc|

ここにコードを書く

||<


サンプル

#import <UIKit/UIKit.h>

@interface DetailViewController : UIViewController <UISplitViewControllerDelegate>

@property (strong, nonatomic) id detailItem;

@property (weak, nonatomic) IBOutlet UILabel *detailDescriptionLabel;
@end

@propertyなどがハイライトされていないのが気になりますが、とりあえずできました。