2012年1月31日火曜日

Xcode 実機で動作しなくなる('NSInternalInconsistencyException', reason: ' Could not load NIB in bundle...)

どうも、俺@絶賛objective-c中です。

Xcode ver.4.2で開発してて、iPhoneシュミレーターでは動作確認できるのですが急に実機で動作しなくなった!という場合の対処法めもです。
場合によっては原因が異なると思うので、これが解決法の全てではないかもしれませんが。。

iPhone実機(5.0.1)に繋いでXcodeからビルド&実行すると以下のようなエラーが出てしまい、ビルドはできるのですが実行できません。

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle (loaded)' with name 'ViewController'
つい5分前までは動いてたのに!
原因はよく分かりませんでしたが、以下をやることで実機でも動作するようになりました。

エラーログにある「ViewController.xib」を開き、右側の「Utilities」>「File Inspector」内にある「Localization」の部分を見ます。
僕の場合は
English
の1つのみが書かれていたので、「Japanese」を追加します。

するとViewController.xibが
ViewController.xib(English)
ViewController.xib(Japanese)
の2つになります。
この状態で実機転送すると動作します。

このあと、なぜか先ほどのLocalizationにある
Japanese
は削除しても実機で動作しちゃいます。

理由はよくわかりませんが、もしトラブった人は試してみて下さい。


以上でぇぇぇぇぇぇす。

UIViewアニメーションで一時停止

どうも、俺@コーディング中です。
今日はObjective-Cでアプリ開発をしてて、UIViewのアニメーションを使うことはよくあるのですが、今日はそのアニメーションを一時停止させる方法をめもめもします。
// hogeLabelの座標は(0, 0)
hogeLabel.frame = CGRectMake(0, 0, 100, 100);

// アニメーション開始
[UIView beginAnimations:nil context:nil];

// アニメーション時間
[UIView setAnimationDuration:1.0f];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];

// hogeLabelを(200, 200)の位置へ動かす
hogeLabel.frame = CGRectMake(200, 200, 100, 100);

[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(hogeLabelStopped:finished:context:)];
[UIView commitAnimations];
とりあえずこれでhogeLabelは座標(0, 0)から(200, 200)へ1秒かけて動くアニメーションができました。
このあとセレクターメソッド(hogeLabelStopped)内で、一旦停止させるには

- (void)hogeLabelStopped:(NSString *)animation finished:(BOOL)finished context:(void *)context
{
  // 一時停止(0.5秒)
  [NSThread sleepForTimeInterval:0.5];

  // その他の動作はこれ移行に記述
}
こんな感じです。[NSThread sleepForTimeInterval:(double) interval]はスレッドをsleepさせる静的なメソッドです。

以上どっぇぇぇぇぇえっぇぇす。

2012年1月20日金曜日

UIViewのアニメーションで画面遷移

どうも、俺@仕事中です。久々のObjective-Cです。
アプリでUINavigationControllerを使わずに画面をアニメーションさせて遷移させる方法を調べたのでメモメモ。

右から左へスライドインする処理
■元画面(FirstView: UIVIewControllerを継承)
// 遷移先UIViewを画面外に生成(SecondView: UIVIewを継承)
secondView = [[SecondView alloc]initWithFrame:CGRectMake(self.view.frame.size.width + 1, 0, self.view.frame.size.width, self.view.frame.size.height)];

// アニメーション開始
[UIView beginAnimations:nil context:nil]:
[UIView setAnimationDuration:0.5]; // 0.5秒かけて
[UIView setAnimationCure:UIViewAnimationCurveLinear]; // 一定速度で
[self.view addSubview:secondView]; // addSubviewする

secondView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height); // 画面内へ動かす
[UIView commitAnimations]; // アニメーションコミット
これで右から画面内へスライドインする遷移ができます。

今度は戻るボタンなどで元画面へ戻る処理です。
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveLInear];
[UIView setAnimationDelegate:self]; // デリゲートをselfで指定
[UIView setAnimationDidStopSelector:@selector(animationStopped:finished:context:)]; // アニメーションが完了した時の処理

secondView.frame = CGRectMake(self.view.frame.size.width + 1, 0, self.view.frame.size.width, self.view.frame.size.height); // 画面外へ
[UIView commitAnimations];
/**
 * アニメーション停止後の処理
 */
- (void)animationStopped:(NSString *)animation finished:(BOOL)finished context:(void *)context
{
  [secondView removeFromSuperview]; // secondViewをremoveFromSuperviewする
}
こうなります。
secondViewをremoveFromSuperviewする場合は、UIViewのsetAnimationDidStopSelectorを使ってアニメーション停止後の処理をセレクターを使って処理させて下さい。そうしないとアニメーションが動きません。
またその場合はUIViewのsetAnimationDelegateメソッドを呼んでおく必要があります。
以上でぇぇぇぇぇぇす。

2012年1月5日木曜日

lsattrとchattrコマンド

明けましておめでとうございます。本年もよろしくお願い致しMuscle!
俺@今日から仕事始めです。

Linuxで削除できないファイルがある、または削除できないファイルを作るなどといった場合に使えるコマンドの紹介です。
これはext2またはext3ファイルシステムで使える、固有のフラグを操作するコマンドです。

chattrコマンドで操作できます。

$ chattr +i hoge.txt
これでhoge.txtは、たとえrootユーザになって削除しようとしても

# rm -rf hoge.txt
rm cannot remove `hoge.txt': Operation not permitted
となります。

このi属性を削除するには

$ chattr -i hoge.txt
でOKです。
引数に「+」で属性追加、「-」で属性削除になります。
操作できる属性は

・a...ファイルの追書き込みのみ許可(append)
・c...ファイルを圧縮しディスクに保存する(compress)
・d...dumpコマンドによるバックアップ候補にしない(dump)
・i...ファイル変更を許可しない。rmやmvができない(immutable)
・A...ファイルがアクセスされた時のatimeを更新しない。Disk I/Oが少し早くなるかも?
・D...ディレクトリに変更があった場合、すぐディスクに保存する。
・S...ファイルに変更があった場合、すぐディスクに保存する。
です。他にもありますが、、
実際使えるとすれば「i」と「A」かな。

任意のファイルの属性を確認するには

$ lsattr hoge.txt
で、上記のフラグのいずかが出ればその属性が立っているということ。
何もなければ(普通ないが)
------------- hoge.txt
となります。


少々マニアックなコマンドですが、プログラムで「何が何でも消してはアカンファイルがある!」という場合など、使えるかもしれません。
また、不正プログラムなどにはこの属性がしてされており、もし管理者が不正ファイルを見つけて消そうとしても簡単には消えないようにされている場合もあります。


以上でぇぇえぇぇす。