2014年4月18日金曜日

Googleの広告デリゲートを別クラスにするには

Gooleの広告(AdMob)のデリゲートをrootViewControllerなんかにいれちゃうと、どうもソースコードがコテコテに油っこくなっちゃいます。

なので、adMob.delegate = selfってやつを、adMob.delegate = adViewController (そう、AdMobの場合、デリゲート先はViewController限定なのでした)なんてすると、どうもハングアップしてしまいます。

しかたないのでrootViewControllerにながながとAdMobのコードを入れ込みましたが、どうも気持ち悪い。


で、rootViewControllerで、どうにかしてadViewControllerを生成してなんとかならないか、いろいろググっても出てこない・・・

いろいろと試した結果、こんな感じで成功しました。

1.FileでViewControllerとしてAdViewController.h/.mを作っておく。

2.ストーリーボードでAdViewControllerをViewController部品をドラックしてきて作る。
 大きさはSizeをFreeformにして、320x50に指定(指定しても関係ないっぽいですが)。
 クラスはAdViewControllerにしておく。
 Storyboard内で繋げないので、Storyboard ID に"adViewController"とか名前をつけておく。

3.rootViewController内でStoryboard内のAdViewControllerのインスタンスを生成しAddViewする。
Storyboard内にAdViewControllerが定義済みなので、そいつを[self.storyboard instantiateViewControllerWithIdentifier:@"adViewController”];でインスタンス化してあげる。
ここがキモでした。

その上で、presentViewController「ではなく」、adViewControllerのビューをaddSubviewしてあげるのです。

#import "AdViewController.h"

@interface rootViewController ()
@property (nonatomic,strong) AdViewController * adVC;
@end

@implementation rootViewController

- (void)viewDidLoad {
[super viewDidLoad];
        
    _adVC = [self.storyboard instantiateViewControllerWithIdentifier:@"adViewController"];
    [self.view addSubview:_adVC.view];

@end

4.最後にAdViewControllerのviewDidLoad内に、self.viewのCGRectで、rootViewController内のView上の位置や、self.view内のAdMobのビューの位置を指定してあげたり、デリゲートをselfにしていろいろ書いてあげたりする。つまりAdMobの処理はAdViewController内に「全て」記載してあげればいい。それだけ。

いやぁ、悩みましたよ。それだけ。はい。

2014年4月17日木曜日

Objective-Cのオブジェクト間のメッセージとデータの共有

オブジェクト指向の場合、いろいろとオブジェクトを分割してはじめてその威力を発揮する。

しかしその場合は、オブジェクトからオブジェクトにイベントとデータを送り、連携しなくてはならない。

その連携の方法の基本は以下の3つに分類できる。

・生成元のオブジェクトから生成先のオブジェクトへのメッセージは、メソッド呼び出し
・その逆はデリゲートとなる。
・任意のオブジェクト間のメッセージは通知(Notification)となる。

やっとわかったよw

あとは、オブジェクト間のデータ共有はこれだ(多分)。
以下ではClassAとClassBとの間でvatModeを共有する。共有は非常に楽ちんだ。

ただしイベントは飛ばないので値の変更通知が必要な場合は上の3つを使うことになる。


なお、プロパティは循環参照にならないので、どのクラスでもStrongでいいらしい。ひとつ賢くなったかなう?

-------SharedValue.h------
‪#‎import‬ <Foundation/Foundation.h>
@interface SharedValue : NSObject
+(id)sharedAllocation;
@property (nonatomic, strong) NSString *vatMode;
@end
-------SharedValue.m------
#import "SharedValue.h"
@implementation SharedValue
static id allocatedInstance = nil;
+(id)sharedAllocation{
if (allocatedInstance == nil) {
allocatedInstance = [[self alloc]init];
}
return allocatedInstance;
}
//--- shared value----------
-(NSString *)vatMode{
if(!_vatMode) _vatMode = [[NSString alloc]init];
return _vatMode;
}
@end
------------------------------------
------ ClassA.m --------------
#import "SharedValue.h"
@interface ClassA ()
@property (nonatomic, strong) SharedValue *sharedValue;
@end
@implementation ClassA
-(id)init {
self = [super init]
if (self) {
_sharedValue = [SharedValue sharedAllocation];
_sharedValue.vatMode = @"ClassA";
}
return self;
}
@end
------ ClassB.m ------------
#import "SharedValue.h"
@interface ClassA ()
@property (nonatomic, weak strong) SharedValue *sharedValue;
@end
@implementation ClassV
-(id)init {
self = [super init]
if (self) {
_sharedValue = [SharedValue sharedAllocation];
_sharedValue.vatMode = @"ClassB";
}
return self;
}
@end
------------------------------------

2014年4月15日火曜日

Storyboard で UITableViewController にツールバーをつけるには

StoryboardでStaticCellを使うにはUITableViewControllerを使う必要があります。

UITableViewControllerをつかってみると、なんとUITableViewがフルスクリーンになったまま、ほかの部品を入れようとしても、テーブル内の部品になり、CancelボタンやDoneボタンを入れ込むことができません。

が、しかし、出来ることがわかりました。


なんと、UIViw部品をUITableView部品の上にねじ込めば(ドラッグすれば)よかっただけなんですよね・・・わからんよ。ガイドしてくれよ・・はぁ、半日悩んだわ・・・

あとNavigationコントローラつけずSegueでpushすることはできないんですが、それもわからんかった。Navigationコントローラつけないんだったら、Modale一択ね。そう言ってくれよ・・ほんと疲れるわ。で完成。


2014年3月18日火曜日

UIViewControllerとUITableViewControllerの違い

TableView生成時にself.viewに合わせてframeを生成しない/する

reloadDataでTableViewの行を変更できる/できない。UITableViewController意味あんのかよ。

tavleView.rowHeightが有効か、有効でないか。ってさ、UITableViewController終わりにしてほしいなう。

わかるまで1週間かかったよ。まったく!

(追記)=> Static cell(ストーリーボード上で見た目編集できるもの)を使うにはUITableViewController必須のようです。UITableViewControllerが使えるのは機能はこれくらいかな?

2014年1月26日日曜日

Xcodeでの最新のAdMob SDK(iOS版)の入れ方

Xcodeでの最新のAdMob SDKの入れ方。

・SDKをダウンロードする

・READMEを除き全てのファイルを組み込むとあるが、ダウンロードファイルからAdd-onsの下のGoogleAnalyticsServicesiOS_3.03フォルダを削除した上で、READMEを除いたAdd-onsフォルダを含むファイルを組み込む。

・Add-onsは不要なようだ。疲れる・・

・指定のライブラリに以外にCoreTelephony.frameworkを入れる。

・AdSupport.frameworkはRequiredからOptionalに変更する(たぶん)。

・ついでにARCを指定して、非ARCのコードにはBuild PhasesのCompile Soucesで-fno-objc-arcをつける(たぶん)

・Build Settings のLinking Other Linker Flagsに-ObjCを加える

なんだそれ。全然書いてないし。Googleグダグダ。

2013年3月9日土曜日

複数のMacでiOS開発を行う

Provisiong Profileを入れたら、Valid signing  identity not found だと。

そーいえば、Macbook PRO Retinaで開発するつもりで、Retinaで登録してたっけ(使ってねー・・・。売り飛ばそうか・・・)。

で、無効のキーをこっちにもってこなくてはいけないのでした。

めんどくせーよ。Appleさんさぁ・・・


[Xcode]新しいMacを買った時など複数台のMacでiOSアプリを開発する方法


http://www.lastday.jp/2012/09/02/multiple-mac-ios-application

Provisioning Profile期限切れからの復活

Appleさん、煩雑な作業はなしにしようよ・・・

Provisioning Profileの起源が切れたらこちら。これも手順がたまに変るからな・・・・

http://iphone.hd-28v.com/?eid=69