× [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。 |
位置情報を使用する既存のアプリへの対処内容
カメラロール、カメラ等でも必要となります。
いままでは「"(アプリ名)"は現在の位置情報を利用します。よろしいですか?」というアラートが自動で表示されていた。 表示されるタイミングはユーザーが「許可しない」「OK」どちらも設定していない状態。 つまり設定値がNULLの状態のときのみ表示されていました。 iOS8からこのアラートの表示に関してソースコード上に書く必要があります。 特にこの機能が必要なければ書く必要はありません。(そんなケース稀でしょうが) またこの設定値がNULLである状況は ・初めてアプリをインストールした時 ・アプリをアンインストールした時 になります。 つまり ・アプリの更新の際はNULLではなく以前のバージョンの設定値を引き継ぐ ・OSバージョンアップの際は以前のバージョンの設定値を引き継ぐ ということです。 なのでiOS8の端末でアプリがない状態でインストールした際にユーザーが「なんでアプリ動かないんだろう?」と困惑しないように実装する必要があります。 CLLocationManager *locationManager = [CLLocationManager new]; [locationManager requestAlwaysAuthorization]; これでアラートが表示されます。ただし、あくまでもNULLのときだけなので毎回聞く様名ことにはなりません。常時許可の設定になります。 2.について これはOSバグに繋がります。 info.plistにNSLocationAlwaysUsageDescriptionもしくはNSLocationWhenInUseUsageDescriptionの項目を追加しないと、位置情報サービスの許可設定が端末に保持されず、毎回設定が必要になります。 対応する必要のある設定値の記述のみで大丈夫です。 元々この設定値は1.のアラートの下にカスタムメッセージを設定する際のメッセージ文言を設定するものでした。そのため必要なければ空でも大丈夫です。あくまでも項目として追加する必要があります。 3.について 許可の種類が常時許可とフォアグラウンド時のみの許可のとなりました。 iOS7までの位置情報サービスの「許可」にあたる設定は常時になります。 以上iOS8に対応したいアプリが位置情報を使っている場合に最低限対応する必要のあるまとめです。 PR |
iOS6からiOS7にアップデートした時にUITableViewとUITableViewCellの階層構造が変わりました。
Cellに直接addSubViewをしている処理やTableViewからCellに情報を渡したい時の処理が変わって対応したと思います。 原因としてはUITableViewとUITableViewCellの階層構造が変わったことです。 今回もiOS7からiOS8のアップデートによって階層構造が変わりました。 以下に6から8までの階層構造です。 iOS6 最下層まで3段階 Cellからは1段階 <UITableView> |<UITableViewCell> | <addSubViewしたUIViewの階層> |<UITableViewCell> | <addSubViewしたUIViewの階層> iOS7 最下層まで5段階 Cellからは2段階 <UITableView> <非公開クラスA> | <UITableViewCell> | <非公開クラスB> | | <addSubViewしたUIView> | | <addSubViewしたUIView> | <UITableViewCell> | <非公開クラスB> | | <addSubViewしたUIView> | | <addSubViewしたUIView> iOS8 最下層まで4段階 Cellからは1段階 <UITableView> <非公開クラスA> |<UITableViewCell> | | <addSubViewしたUIViewの階層> | | <addSubViewしたUIViewの階層> |<UITableViewCell> | | <addSubViewしたUIViewの階層> | | <addSubViewしたUIViewの階層> iOS7からiOS8になったらアコーディオンの体裁崩れが起きた場合はiOS6のときのロジックで良いかと思います。 |
最近Blockをよく使うのでまとめ。
まず前提としてblockの中でインスタンス変数を使用する場合の注意点。 ・循環参照 block内でインスタンス変数にアクセスする場合インスタンス変数を直接参照するのではなく、そのインスタンス変数が属しているインスタンスオブジェクト全体を参照するため循環参照が発生する。 コレを回避する為に自インスタンスを弱参照のオブジェクトに代入してブロック内で強参照のオブジェクトとして扱う必要がある。 @propaty (strong,nonatomic) IBOutlet *messageLabel; __weak typeof(self)weakSelf = self; anotherClass.handler = ^(NSString *messageString){ __strong typeof (weakSelf)strongSelf = weakSelf; [strongSelf-> messageLabel setText:messageString]; } こんな感じ。 |
特定のImageViewをドラッグできるようなプログラムが必要になってつまった。
最初に考えた方法 Google先生に教えてもらう ・UIGestureRecognizerをつかってやる。 どうもうまく行かない。 たしかに動く。だけどもどこに指を置いても反応する。 ・やってて思ったこと。 各UIViewクラスのサブクラスのオブジェクトに対して設定してドラッグイベントが発生したらオブジェクトを引数として受け取ってイベント処理をしてくれるような物はないのか? あとStoryBoardでUIのセッティングができるやつ。 ・UIImageViewやめてUIButtonにしてアクションをTouch Drag Insideでやる。 発想は良かったんだと思う。StoryBoard(iPhoneのGUIでの画面設定)をつかったサンプルが皆無なので海外サイト含めて探したけど見つからない。 いったんあきらめて動作をどんな方法でもいいから実現するプランに変更。プランBに変更! ・動的にUIButtonを設定する。 Buttonで設定していますが多分ImageViewでも出来ます。 やはり問題はソースコードで全てのオブジェクトをインスタンス生成しなければいけない状態(今回は全部で14個) ホントにコレでいいのかな?と確信をもてないので次回までの課題とします。 画像だけじゃなくてtagとか位置とかも一緒に情報として設定しておく方法がとりやすくなりそうではあるけど。 |
NSArrayでNSDictinary型の配列を一発で作れないかと考えた。
※NSArrayとNSDictionaryの新しい宣言方法の確認 // NSArray NSArray *arr = @[@"TOKYO",@"LONDON",@"NEWYORK",nil]; // NSDictionary NSDictionary *dic = @{@"TOKYO":@"JST"}; 従前の記入方法よりカジュアルになった。(見た目が 表題のNSArrayでNSDictionary型の配列をつくった。 NSDictionaryはオブジェクトなのでNSArrayに入れることができるが書き方が分からなかった。 NSArray *arr = @[@{@"TOKYO":@"JST",@"country":@"JAPAN"}, @{@"LONDON":@"GMT",@"country":@"UK"}, @{@"NEWYORK":@"EST", @"country":@"USA"}]; @マークだらけで見づらいが便利。 |
忍者ブログ [PR] |