2014年9月3日水曜日

ワーニング Capturing 'self' strongly in this block is likely to lead to a retain cycle

Capturing 'self' strongly in this block is likely to lead to a retain cycle

こんなエラーが出てしまった。

    [oPageView setViewControllers:nextPage direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:^(BOOL finished) {
        [oTableView scrollToRowAtIndexPath:iPagePath atScrollPosition:UITableViewScrollPositionTop animated:YES];

    }];


Blockの中にインスタント変数を参照するとワーニングになります。

    __block UITableView *tablViewself = oTableView;
    [oPageView setViewControllers:nextPage direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:^(BOOL finished) {
        [tablViewself scrollToRowAtIndexPath:iPagePath atScrollPosition:UITableViewScrollPositionTop animated:YES];
    }];


こんな感じで、変数を外だしにするとOKです。

Warning ワーニング 'UITextAlignmentCenter' is deprecated: first deprecated in iOS 6.0

'UITextAlignmentCenter' is deprecated: first deprecated in iOS 6.0


こんなワーニングがでました。



×  [self.title setTextAlignment:UITextAlignmentCenter];
        

   [self.title setTextAlignment:NSTextAlignmentCenter];

上のように変更したら、oKになりました。

Warning ワーニング Property access result unused - getters should not be used for side effects

 Property access result unused - getters should not be used for side effects

こんなワーニングだ出ていました。


調べたところ、

オブジェクト.関数名

となっているところを

[オブジェクト 関数名]
にすると
OKでした。



oWebView.goBack;
[oWebView goBack];

2014年8月27日水曜日

Deprecations 'setFont:' is deprecated: first deprecated in iOS 3.0

こんなワーニングが出てしまった。。。

'setFont:' is deprecated: first deprecated in iOS 3.0

こんな使い方が駄目らしい。。。

[oBackBtn setFont:[UIFont fontWithName:sFONTNAME size:15]];


修正後
[oBackBtn.titleLabel setFont:[UIFont fontWithName:sFONTNAME size:15]];

2014年1月31日金曜日

エラー Failed to instantiate the default view controller for UIMainStoryboardFile 'Storyboard' - perhaps the designated entry point is not set?

Failed to instantiate the default view controller for UIMainStoryboardFile 'Storyboard' - perhaps the designated entry point is not set?


initial Sceneの設定がちゃんとできていないと表示されます。

または


2014年1月5日日曜日

ASO( AppStoreランキング向上, ランキング向上, 検索上位)

アプリのインストール数を増やすために必要なのがASO!!

AppStoreで言うと、キーワードやタイトルを改良することで改善され、
検索上位に表示されます。

どこかの数字によると、
Storeで検索してから、アプリをインストールするユーザーは60%いるそうです。

何か、いいもの作ったけど、あんまりアプリをインストールされていない!!って人は是非試してみて下さい。

ついでに自分はインストール数が10倍増えました。いや、本当に!!
お金をかけずに簡単にインストール数を増やせます。

では何をするかというと、

①タイトルを長くします。

パズル&ドラゴン
とか
LINE

みたいな有名なアプリはユーザーがタイトルからアプリを一本釣りでインストールするアプリです。
ですが、あなたが作るアプリは一本釣りされるアプリではありません。

なので、タイトルを255バイトいっぱいにつけましょう

パズル&ドラゴン -無料,RPG, アクション
LINE -無料,Mail,メール,通話

これが255バイトあるかわかりませんが、こんな感じでいろいろな単語を入れておくの重要です。
タイトルにある単語が検索の時に引っかかる単語なので、是非いろいろと試して下さい。
また、AppStoreの検索ロジックの特徴として、メールとMailで検索結果が大きく違う事です。
google Playだと、そこら辺の空気を読んでくれますが。。。。

②キーワードの登録です。
これは①に入っていない単語を載せる事がミソです。
タイトルとキーワード2つあると強くなる!!みたいなことはありません。
潔く、タイトルと違う文字を入力してください。

なので、ヴァイオリン,バイオリン
見たいに書くのをオススメします。

③いいレビューを貰う
これはすぐにできる事ではないのですが、
簡単にできることとして、アプリからレビュー画面に遷移するボタンを作っておくといいよ。

以上です。


アプリの説明文は、何かないの??

とか思われる方もいるかもしれません。
GooglePlayだと、キーワードを5つ重複させる事が重要とか、
あるんですが、AppStoreはないです。
アプリの説明文は検索表示と関係ないです(多分。。)


終わりに
自分の感想ですが、GooglePlayよりもAppStoreの方が
ASOでわりとインストール数を稼げます。

2013年12月23日月曜日

012-ロード中にぐるぐる回すインディケーター( UIActivityIndicatorView, UIActivityIndicatorViewStyleWhiteLarge)

ロード中や読み込み時に表示するグルグル回すインディケ−タの使い方を記述します。

■生成
UIActivityIndicatorView* indicator = [[UIActivityIndicatorView alloc] init];

■オブジェクトの場所を指定
[indicator型 setFrame:CGRectMake(0, 0, 100, 100)];

■くるくる回す
[indicator型 startAnimating];

■くるくる回さない
[indicator型 stopAnimating];

■回っているかの判定
[indicator型 isAnimating
返し値はBOOL値

■ぐるぐるが回っていない時にぐるぐるを非表示時にするかの設定
[indicator型 setHidesWhenStopped:(BOOL)]
YES,NOで設定。true falseでは駄目だった

■ぐるぐる停止時の表示を取得
[indicator型 hidesWhenStopped]
返し値はBOOL値

■ぐるぐるの大きさの指定
indicator型.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;

定数
UIActivityIndicatorViewStyleWhiteLarge
白色、大きめ

UIActivityIndicatorViewStyleWhite
白色

UIActivityIndicatorViewStyleGray
灰色



■サンプルソース
#import "ViewController.h"

@interface ViewController (){
    // アクティビティインジケータ変数
    UIActivityIndicatorView* indicatorLarg;
}

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    //画面背景を黒色にする
    [self.view setBackgroundColor:[UIColor blackColor]];

    //ぐるぐる回るポジション
    CGRect rect                            = CGRectMake(0, 0, 100, 100);
    
    //ぐるぐる回るインディケータの生成
    indicatorLarg = [[UIActivityIndicatorView alloc]initWithFrame:rect];
    
    // アクティビティインジケータのスタイルをセット :今回は大きめのサイズ
    indicatorLarg.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
    
    // くるくるをまわす
    [indicatorLarg startAnimating];
    // UIActivityIndicatorViewのインスタンスをビューに追加
    [self.view addSubview:indicatorLarg];
    
    //タッチジェスチャーを取得
    UITapGestureRecognizer* tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)];
    //タッチジェスチャーをビューに設定
    [self.view addGestureRecognizer:tapRecognizer];
}

//タッチされた時の判定
- (void)handleTapGesture:(UITapGestureRecognizer *)sender {
    //ぐるぐる回っているかの判定
    if ( [indicatorLarg isAnimating] ){
        //ぐるぐるSTOP!!
        [indicatorLarg stopAnimating];
        
        //ぐるぐるSTOP時に隠すか止まったままにするか
        bool bIsHide = [indicatorLarg hidesWhenStopped];
        [indicatorLarg setHidesWhenStopped:!bIsHide];
        
    }else{
        //ぐるぐる回っていなかったら、回す
        [indicatorLarg startAnimating];
    }
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end


■実行結果


こんな感じになります。

タッチすると、ぐるぐるが止まって、
もう一回タッチすると動きだします。


このロード中のぐるぐるの正式名称は何て言うんですかね??

2013年10月27日日曜日

古いXcodeをインストール

自分は勇者タイプなので、 OSやソフトに新しいバージョンがあると果敢に挑みます。

だがしかし、
適応能力がいまひとつのために新しいバージョンに付いていけない事があります。
今回はXcode5にしたものの、iOS7化対応に付いていけなくて
。。。。。
そんな時のために
 Xcodeのバージョンを複数もつ方法を紹介します。




【Finder】→【Xcode】→【右クリック】→【パッケージの表示】→【_MASReceipt】のフォルダ名を変更

これで、他のバージョンのXcodeが上書きされなくります。


https://developer.apple.com/downloads/index.action#

ここで、xcodeで検索すれば、上書きしないでインストールできます。

2013年10月13日日曜日

Xcode5 電波情報などのステータスバーを消す(View controller-based status bar appearance)


 [ UIApplication sharedApplication ].statusBarHidden = YES;

今まではこのソースで消せたのですが。。

Xcode5のせいかiOS7のせいか消せなくなりました。。。。


格闘する事、10,000時間。。。。






Keyのところに+をクリックして、

View controller-based status bar appearance

Type を Boolean

Value を NO


にすると、

 [ UIApplication sharedApplication ].statusBarHidden = YES;

のソースが利くようです。

あー、面倒だ

2013年9月20日金曜日

Appleから The bundle does not contain an app icon for iPhone

The bundle does not contain an app icon for iPhone / iPod Touch of exactly '120x120' pixels, in .png format

アプリをアップロードしたら、こんなエラーが出ました。。


アプリのアイコン120×120が必要らしいです。



けど、この画面には120×120をはめる場所がなくて。。。
あたふたする事、10時間

Summaryタブから、Infoタブに遷移して
icon_filesに新しいitemを作り120×120の画像を
入れるとOKです。





iOS7から、アイコンが120×120になるのですかね??

2013年8月25日日曜日

iconをテカらせない、ツヤ消し

iconがテカるのがいやなので、
テカらせない方法を探していたのですが、

検索ワードのセンスがなかったのか、
なかなかお目当てのページが見つかりませんでした。。。

■方法


Icon already includes gloss effects
この値をBoolean型のYESにすると完了です。
「アイコンはもうテカテカです。」
という意味らしいです。

[Icon files]→[Primary Icon]の中に作ってね!!!!


2013年7月31日水曜日

JSON(NSJSONSerialization)

Objective-CでJSONを使いたかったので、少し勉強してみました。


NSDictionary *jsonParser = [NSJSONSerialization JSONObjectWithData:WebApiから取得した文字列のデータ型 options:NSJSONReadingAllowFragments error:nil];


こんな感じで、Dictionaryに格納したら、後はDictionaryをガンガン使っていけばいいだけです。

■例

{"resulr":"true","item_list":{"item_1":"apple","item_2":"banana","item_3":"melon"}}

こんな、文字列をWebから貰ったとします。。


    //文字列型をデータ型に型変更
    NSData       *data = [string dataUsingEncoding:NSUTF8StringEncoding];

    //ディクショナリに入れる
    NSDictionary *jsonParser = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
  
    //resultを取得
    NSDictionary *next = [jsonParser objectForKey:@"result"];
    //LOG
    NSLog(@"%@", [jsonParser objectForKey:@"result"]);
    
    //深めの階層も大丈夫!!
    NSDictionary *country = [jsonParser objectForKey:@"item_list"];
    NSLog(@"%@", [jsonParser objectForKey:@"item_list"]);
    
    //取得したい値を取得
    NSDictionary *item = [country objectForKey:@"item_1"];
    NSLog(@"%@", [country objectForKey:@"item_1"]);



■結果


2013-07-31 01:59:01.046 jsontest[678:c07] {"result":"true","item_list":{"item_1":"apple","item_2":"banana","item_3":"melon"}}
2013-07-31 01:59:01.048 jsontest[678:c07] true
2013-07-31 01:59:01.048 jsontest[678:c07] {
    "item_1" = apple;
    "item_2" = banana;
    "item_3" = melon;
}
2013-07-31 01:59:01.048 hidouki[678:c07] apple


こんな感じになりました。
そもそもDictionary型をちゃんと理解していないので、
こんな使い方でいいのかわかりませんが。。。。
とりあえずは、APIの戻り値をさばけました。。

2013年6月30日日曜日

アプリの表示固定( orientations)

アプリを端末の向きに依存させたくない時、ありませんか??

横固定だったり、縦固定だったりと

そんな時は

対象のプロジェクトをクリック→TARGET→Summary


Supported Interface Orientations
で選びます。
可能な画面表示を選びます。

黒っぽいのが選択中ってことです。

Portrait              :縦画面OK
UpsideDown    :上下反転OK
LandScapeLeft :横表示のボタン左側OK
LandScapeRight :横表示のボタン右側OK

開発中に特別に画面の横対応をしていないのなら、
縦画面の左2つを選択しておくといいかなとおもいます。


反対に画面の横対応しかしていないなら、
右2つを選択していればだいたいOKです。




2013年6月29日土曜日

なうい 配列の書き方

今日職場のおじいちゃんに
「お前のコーティングの書き方は古い!!」

と言われちゃいました。。。

聞くところによると、
iOS 10.5
以前と以降で推奨される、
書き方がいろいろと変わっていました。


とりあえず、今日調べたところを書きます。

■配列の作成

//  NSArray* oCountryArray = [NSArray arrayWithObjects:@"スペイン",@"イングランド",@"イタリア",@"ドイツ",@"オランダ",nil];
    NSArray* oCountryArray = @[@"スペイン",@"イングランド",@"イタリア",@"ドイツ",@"オランダ"];



上が古くて下が新しいです。

基本的にはスッキリン子しました。
また、nilがなくなったのが個人的にはうれしいかな。

■配列の取り出し

//        NSString* aLabel = [oCountryArray objectAtIndex:_cellCount];
        NSString* aLabel = oCountryArray[_cellCount];


これもシンプルになっています。
他のjavaとかと同じ感じですね。

他にも見つけたら、載せます。

2013年6月16日日曜日

エラー error: failed to attach to process ID 0


error: failed to attach to process ID 0


何のエラーか、よくわからなかったけど。。

どうやら、シミュレータのエラーのようです。

シミュレータ内のデータが消えてもいいのなら、




コンテンツと設定をリセットを選択。。

2013年5月17日金曜日

エラー error: PCH file built from a different branch


error: PCH file built from a different branch 


XCODEのバージョンアップ後に発生!!

プロジェクトをクリーンしたら、問題解決

2013年5月6日月曜日

011-Foundation(フレームワーク, import)


Foundationは文字列や配列の処理、HTTP通信などの基本クラスを集めたフレームワークです。
クラスも多々ありますが、有名どころを下記にしるします。
リンク先はリファレンスになっております。

■代表的なクラス

NSArray  配列を扱うクラス
NSDate   日時を扱うクラス

NSString 文字列を扱うクラス
NSTimer  時間処理を行うためのクラス


■Foundationフレームワークの使い方
作成したプロジェクトの「Frameworks」に「Foundation」があるかの確認して見ましょう


■.pchファイル
#import <Availability.h>

#ifndef __IPHONE_5_0
#warning "This project uses features only available in iOS SDK 5.0 and later."
#endif

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
#endif



#import <Foundation/Foundation.h> が存在していれば、
どのクラスでもわざわざ各クラスでimportしなくても「Foundation」のフレームワークが利用できます。

2013年5月5日日曜日

objectie-c エスケープ文字

エスケープ文字で改行や、タブの文字列もコントロールできるようにしましょう

シングルクォーテーション
@"\'"

ダブルクォーテーション
@"\""

改行
@"\n"

タブ
@"\t"

バックスラッシュ
@"\\"


【例】
//改行でスプリット
NSArray* sText = [sHTML componentsSeparatedByString:@"\n"];

//こんな文字列で始まっていたら
if ( [str hasPrefix:@"<a class=\"ts_left\" href=\""] ){







2013年4月24日水曜日

012-NSString(Foundation)

NSStringクラス

生成
NSString* 変数名 = @"文字列";

NSString変数名 = [[NSString alloc] initWithString:@"文字列"];

NSString* 変数名 = [NSString stringWithFormat:@"文字列"];

こんな感じで生成できます。


■指定した文字かの判定

NSString* sText = @"比較先";
[sText isEqualToString:@"比較もと"];

結果はBooleanで返されます。
今回の出力結果は偽になります。

■指定した文字列ではじまっているかの判定

NSString* sText = @"比較先";
[sText hasPrefix:@"比較"];

結果はBooleanで返されます。
今回の出力結果は真になります。

■指定した文字列で終わっているかの判定

NSString* sText = @"比較先";
[sText hasSuffix:@"較先"];


結果はBooleanで返されます。
今回の出力結果は真になります。

■文字列の後ろから返す

NSString* sText = @"比較先";
[sText substringFromIndex:int型];

指定した文字列から最後までの文字列を返します。


[sText substringFromIndex: sText.length - 1]

こんな感じにすると、sTextの最後の文字列を返します。
-1を-2にすると、後ろから2文字目を全て返します。。。


2013年4月7日日曜日

010-ピッカーの表示(UIPickerView)

ピッカーの使い方に関して。。

iPhone使ってる人はピッカーで何の事かわかるのすかね??

ドラムロールから、任意のステータスを選択するあれです。

では、例文です。

■サンプルソース

h.ファイル


#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UIPickerViewDelegate,UIPickerViewDataSource>{
    NSArray*       aItemList;
    UIPickerView*  oPicker;
    UILabel*       oLabel;
}

@end


m.ファイル

#import "ViewController.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [self showPicker];
    [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)showPicker {
    //ピッカーにアイテムを格納
    aItemList = [[NSMutableArray alloc] initWithObjects:@"リンゴ",@"バナナ",@"マンゴー",@"パパイア", @"ドリアン",nil];
    
    // ピッカーの生成
    oPicker = [[UIPickerView alloc] init];
    //中央に表示
    oPicker.center = self.view.center;
    oPicker.showsSelectionIndicator = YES;
    oPicker.delegate = self;
    oPicker.dataSource = self;
    //画面に追加
    [self.view addSubview:oPicker];
    
    //ラベルの生成
    oLabel = [[UILabel alloc] init];
    oLabel.frame = CGRectMake(0,0,200,50);
    oLabel.text  =@"何が選ばれるのだろう";
    //画面に追加
    [self.view addSubview:oLabel];

}

//区切りの数(コンポーネント)
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
    return 1;
}

//コンポーネントの行数を返す
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
    return [aItemList count];
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
    return [aItemList objectAtIndex:row];
}

//選択完了時に呼ばれる
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
    //選択行を返す
    NSInteger id = [pickerView selectedRowInComponent:0];
    oLabel.text  = [NSString stringWithFormat:@"%@",aItemList[id]];
}

@end


■実行結果




実行すると、
選択した項目が文字列で出力できていることが確認できると思います。

hファイルでデリゲートの準備をし忘れないように!
@interface ViewController : UIViewController <UIPickerViewDelegate,UIPickerViewDataSource>{

mファイルの生成時にデリゲートが呼ばれます。
oPicker.delegate = self;
oPicker.dataSource = self;


//選択完了時に呼ばれる
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
この関数を作成すると、選択している項目を取得できます。


正直UIPickerViewはコードで全部書くのはしんどかったです。
はい。