FrontPage

Objective-CというかiOSというかXcodeというかそんな感じのメモ。

UIナビゲーション

2つ戻る

遷移はviewControllersに積まれているので、そこから取り出してpopToViewController?(popViewController?ではない)に渡す。

// back to event list view
int count = [self.navigationController.viewControllers count];
[self.navigationController
    popToViewController:[self.navigationController.viewControllers objectAtIndex:count - 3]
               animated:YES];

UI

UIViewの識別

tagプロパティを使う。

UIView *view = [[UIView alloc] init];
view.tag = 0;

if (view.tag == 0) {
} 

KVO

observeValueForKeyPath?が反応しない

監視対象のオブジェクトがKVOに準拠していない。 例えば監視対象のプロパティHogeがNSMutableArray?なら以下を実装する必要がある。

  • counfOfHoge?
  • insertObject:inHogeAtIndex?
  • removeObjectFromHogeAtIndex?

キー値監視プログラミングガイド、キー値コーディングプログラミングガイドを熟読すること!

Observerを開放するタイミング

observerのインスタンスが開放されるタイミングで 必ずremoveObserver すること。例えばこのへん。

  • viewDidUnload?
  • dealloc

開放を忘れると監視対象オブジェクトが更新されたタイミングで、EXC_BADACCESSに見舞われることになる…。

通信処理

一つのオブジェクトで複数の通信を識別・判断する

コネクションオブジェクトにラベルを貼り付ける(setAccessibilityLabel?)。

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:@"http://example.com"];
NSURL *connection = [NSURLConnection connectionWithRequest:request delegate:delegate];

[connection setAccessibilityLabel:@"CREATE_EVENT"];

コネクションのラベルで判断。

if ([[connection accessibilityLabel] isEqualToString:@"CREATE_EVENT"])
{
    // イベント作ったよ
}
else if  ([[connection accessibilityLabel] isEqualToString:@"JOIN_EVENT"])
{
    // イベントに参加したよ
}

CoreLocation?

Location Serviceの有効無効判定

locationManager = [[CLLocationManager alloc] init];

if ([CLLocationManager locationServicesEnabled]) {
    // ロケーションサービスが有効な場合の処理
    [locationManager startUpdatingLocation];
} else {
    // ロケーションサービス使えないよ
}

アプリケーション個別の設定はこのコードでハンドリング出来ないので、 デリゲートメソッドdidFailWithError?を使って判定する。

@interface SomeClass ()
@property (strong, nonatomic) CLLocationManager *manager;
@end

@implementation SomeClass
@synthesize manager = _manager;

-(void)buttonTapped
{
    self.manager = [[CLLocationManager alloc] init];
    self.manager.delegate = self;
    [self.manager startUpdatingLocation];
}

-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    NSString *message;
    switch ([error code]) {
        case kCLErrorDenied:
            message = @"システム設定で位置情報取得が無効にされてるよ。";
            break;
            
        default:
            message = @"位置情報を取得できませんでした。";
            break;
    }
    NSLog(message);
}

@end

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-11-08 (金) 11:32:16 (1292d)