Objective-Cのブロックを変数に入れて呼び出す

Objective-Cのあるひとつのメソッド内のあちこちで実行される処理があるような時に、ブロックを変数に入れて何ヶ所かで呼び出したい時がある。書き方をよく忘れるので、Objective-CでBlockを変数に入れる方法の具体例を挙げる。

続きを読む Objective-Cのブロックを変数に入れて呼び出す

星でレーティングするAXRatingViewをつくった

AXRatingViewプレビュー

https://github.com/akiroom/AXRatingView

iOSアプリを作っていて星をタップしてレーティングできるビューが欲しかったのですが、フラットデザインっぽい感じで色々設定できるようなライブラリが見つからなかったので、自分で作りました。上のスクリーンショットを見ていただければ分かる通り、以下のような特長があります。

  • 漸次的/段階的なレーティング
  • 自由な文字を設定できる
  • 自由な画像を設定できる
  • editable/non-editableの切り替えが可能
  • 星の数を増減できる
  • addTarget:action:forControlEvents:で簡単に変更の通知イベントを割り当てられる
  • ★マークのような画像リソースの用意が不要

ソースコードのダウンロードは以下のURLからできます。

https://github.com/akiroom/AXRatingView

既にcocoapodsに登録済みなので、Podfileに次のように書いてpod installすればすぐに使えます。

pod 'AXRatingView', '~> 0.9.4'

heightForHeaderInSection:とheightForFooterInSection:のデフォルト値

UITableViewControllerの中でヘッダーやフッターの高さを変えたいけど、デフォルトの高さも使いたい時。UITableViewAutomaticDimensionを返せばよい。

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
  if (section == 0) {
    return 32.0;
  } else {
    return UITableViewAutomaticDimension;
  }
}

NSStringが指定した文字のみで構成されているかチェック

NSStringが特定の文字だけで構成されているか判定したいことがある。文字種だけの問題で正規表現を使う程ではない、という時は、NSCharacterSetの包含関係の判定を使うと簡単にチェックできる。パスワードのValidationとか、UITextFieldに数字のみを受け付ける場合のちょっとしたチェックなどに便利。

続きを読む NSStringが指定した文字のみで構成されているかチェック

StoryboardのTableViewでセルがはみ出して操作できない

StoryboardにUITableViewControllerを置いて、Prototype Cellを設定している時、様々な種類のセルを設定しているうちに、ViewControllerの高さが足りなくて下の方の要素が見られないことがある。その時の対処法。

以下の記事を参考にしたら解決した。
Can’t scroll to the bottom of a long Static TableViewController in XCode 5 Interface Builder to edit the cells below the fold

StoryBoard上でスクロールできるようにしたいViewControllerを選択して、Attributes InspectorのView ControllerのExtend Edgesの中にある”Under Top Bars”と”Under Bottom Bars”のチェックを外す。
Extend Edges in Xcode
この2つのチェックを外すと、TableViewの上でスクロールできるようになる。

Thanks to @shao1555!

Xcodeで”Could not read from the device.”というエラー

Xcode4でiOSアプリのコンパイルは通るのに実機で起動しようとするとCould not read from the device.と出る場合の対処方法

Could not read from the device.
しばらく経つと、Could not start debugserver on “(iPhoneの名前)” when trying to launch “(アプリケーションの名前)”とも表示された。

Could not start debugserver on “(iPhoneの名前)” when trying to launch “(アプリケーションの名前)”

続きを読む Xcodeで”Could not read from the device.”というエラー

UINavigationControllerのtopViewControllerのクラスを取得

当ブログのアクセスログを見ていると、「ios クラス名 topviewcontroller」という検索ワードが。UINavigationControllerのtopViewControllerのクラス名を取得したい場合や、クラスごとに処理を分岐させるには、以下のように書けばよい。

ポイント

  • [instance class]とすると、そのインスタンスのクラスオブジェクト(Class)が取得できる
  • NSStringFromClass()関数を使うと、クラスオブジェクトの名前をNSStringに変換できる
  • [instance isMemberOfClass:aClass]とすると、そのインスタンスがaClassのインスタンスである場合のみYESが返ってくる。
  • [instance isKindOfClass:aClass]とすると、そのインスタンスがaClassのインスタンスか、あるいはaClassを継承したクラスのインスタンスかどちらかの場合に、YESが返ってくる

続きを読む UINavigationControllerのtopViewControllerのクラスを取得

UIWebViewでNSBundle内のリソースを読み込むと”WebKit discarded an uncaught exception”とエラー

UIViewControllerのviewWillAppearの中でUIWebViewに対してバンドル内のリソースを読み込もうとすると、エラーが起きた。しかも、実機では狙った通り動くのに、iOSシミュレーターでのみエラーが起きる。書いたコードは以下の通り。

- (void)viewWillAppear:(BOOL)animated
{
	[super viewWillAppear:animated];
	NSString *path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"];
	NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:path]];
	[self.webView loadRequest:request];
}

起きたエラーは次の通り。

*** WebKit discarded an uncaught exception in the webView:decidePolicyForNavigationAction:request:frame:decisionListener: delegate:  *** -[NSRegularExpression enumerateMatchesInString:options:range:usingBlock:]: nil argument

続きを読む UIWebViewでNSBundle内のリソースを読み込むと”WebKit discarded an uncaught exception”とエラー