2014年3月19日水曜日

ios 同期通信でpostする

iosで同期通信でpostします。

いきなりcodeです。

     
    // Send a synchronous request
    NSURL *url = [NSURL URLWithString:@"url名"];
    // post情報をくっつけるので、NSMutableURLRequestを使用
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    // Set the method(HTTP-POST)
    [request setHTTPMethod:@"POST"];
    // Set the request-body.
    NSString *reqBody = [NSString stringWithFormat:@"login[account]=%@&login[password]=%@",account名,password];
    // utf8にする
    [request setHTTPBody:[reqBody dataUsingEncoding:NSUTF8StringEncoding]];
    
    // 吐き出すエラー
    NSError * error = nil;
    NSURLResponse* response = nil;
    
    
    
    NSData* data = [NSURLConnection sendSynchronousRequest:request
                                          returningResponse:&response
                                                      error:&error];
    // 通信が行なわれた後に実行されます。
   // 電波が悪く通信できなかった(errorStringにinternet can't useとかデル)
    NSString *errorString = [error localizedDescription];
    if(0 < [errorString length])
    {
       // error処理
    }
    // 通信成功
    else
    {
       // utf8で返った情報をとってくる
       NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
       // jsonデーターをとってこよう
       NSDictionary* jsonObj = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
       // 返った情報を表示
       NSLog(@"result: %@", result);
    }


解説は、コメントに書いたので、特にないっすね。

2014年3月18日火曜日

ios Bundle Identifierの初期値を設定する方法

ios Bundle Identifierの初期値を設定する方法です。

githubから参考したいプロジェクトをダウンロードした時に、
bundle identifierに元で設定してあった値が代入されてしまっていたので、
それを直したいと思って調べました。


まず、プロジェクトのplistファイルをクリックします。


すると、次の画面が出てきます。


Bundle identifierを変えてください。

2014年3月3日月曜日

ios xibで作ったカスタムセルをTableViewに登録する方法

ios xibで作ったカスタムセルをTableViewに登録する方法

まずは、対象となるUITableViewにxib部品を登録します。


    UINib *nib = [UINib nibWithNibName:@"ButtonCell" bundle:nil];
    [_tableView registerNib:nib forCellReuseIdentifier:@"PagingCell"];
登録するxibファイル名をnibWithNibNameに登録し、 xibで作成した、セル名を登録します。
そして、呼び出す時は、次のように記述します。

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    

    PagingCell *cell = [_tableView dequeueReusableCellWithIdentifier:@"PagingCell"];
    // セル特有の処理

    return cell;
}



cxc

2014年2月26日水曜日

ios UITableViewで1行のみを更新する方法

ios UITableViewで1行のみを更新する方法です。

更新したい場面で、
    
[self.tableView reloadRowsAtIndexPaths:
[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:1]] withRowAnimation:UITableViewRowAnimationNone];

を記述します。


この場面では、1Section,0Rowのテーブルセルを更新しています。

0Sectionの0Rowから、0Sectionの8Rowまでを更新したい場合はforを使ってやればOK

ios 親から子への値渡し

ios 親から子への値渡しのやり方です。


StoryBoardを使用して、ナビゲーションコントローラーの親から子へデリゲートを使用して、値渡しを行いたいと思います。

まず、StoryBoardの設定からです。



ナビゲーションコントローラーを引っ張って、2つのビューコントローラーに結びつけます。


1番目のViewControllerにBar Button Itemを置いて、次のViewControllerにセグウェーでひもづけます。

やり方は、

1.Bar Button ItemのSecondを右クリック

2.そのまま移動すると、青い線が引かれると思うので、SecondViewControllerにもっていって、そのままドラックを解放します。

3.すると、push,modalなどを選択する表示画面が現れるとおもうので、
pushを選択します。

これで、画面遷移が完成しました。


○次は、値渡しです。

親をViewController,子をViewController2とします。


まずヘッダーに記述します。(ViewController.h)

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@property (strong,nonatomic) NSString* str;

@end

続いて子のヘッダーにも同じプロパティを用意します。

(ViewController2.h)

#import <UIKit/UIKit.h>


@interface ViewController2 : UIViewController
@property (strong,nonatomic) NSString* myStr;
@property (weak, nonatomic) IBOutlet UILabel *label;  // 値表示用

@end


ヘッダーにプロパティを代入しました。
では、実際に遷移するところを見ます。
今回は、StoryBoard上で、BarButtonItemからセグウェーを仕込んだので、
画面遷移前に呼び出される
prepareForSegueメソッドで値渡しのプログラムを記述します。

StoryBoard上から遷移したので、遷移先のidentifierを登録して
プログラム上で、どこへ遷移するのか判別できるようにします。


遷移先のidentifierに入力したら画面遷移のところで、値を渡せるようにします。

(ViewController.m)

/*
    画面遷移前に呼び出されるメソッド
*/
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    _str = @"delegate";
    if ( [[segue identifier] isEqualToString:@"SecondPush"] ) {
        ViewController2 *Con2 = [segue destinationViewController];
        Con2.myStr = str;   // 子に親の値を渡す
    }
}

これで、子に値を渡すことができました。


2014年2月24日月曜日

UITableViewのセルをハイライトさせない方法(StoryBoard)

UITableViewのセルをハイライトさせない方法(StoryBoard)です。

StoryBoardからハイライトさせない場合は、
テーブルのセルを選択して、Attribute InspectorのSelectionをNoneにします。


コードでやる場合


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

メソッドで、生成されたセルに対して、
cell.selectionStyle = UITableViewCellSelectionStyleNone;

を入れてやる。

jsonで返ってくるnullをobjective-cで判定する

jsonで返ってくるnullをobjective-cで判定する方法です。

以下のようなjsonデーターがあるとします。

hoge{

    hoge2:[
        {
        },
        {
        }
    ],
}

hoge2の中身が空かどうか判定したい場合


if([jsonObj valueForKeyPath:@"hoge.hoge2"] = null)
{

}

(jsonObj はNSDictionary型のjsonを取得したオブジェクト)

では、nullを判定してくれません。


では、どうするかというと...


if([jsonObj valueForKeyPath:@"hoge.hoge2"] = [NSNull null])
{

}

これで、nullを判定してくれます。

2014年2月21日金曜日

TableViewの特定のセクションヘッダを表示させない方法

TableViewの特定のセクションヘッダを表示させない方法


StoryBoardでいくつかTableViewを置いて、特定のテーブルだけSectionを表示させない
方法です。


UiViewControllerに2つのTableViewを配置しました。


この2つを区別させる為にtagを設定しましょう!


attribute inspectorのViewのTagの項目に数字をいれます。
上のTableViewに対して0,下のtableViewに対して1を代入します。

これで、どのテーブルが呼ばれたか判定できるようになりました。


では、コードで上のTableViewのSectionが表示されないようにしましょう。

/*
 セクションヘッダのビューを返す
 */
-(UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    
    // 上部テーブル
    if(tableView.tag == 0)
    {
        // 無視したいので、nil
        return nil;
    }
    else
    {
        // オリジナルのviewを返す
        UIView* view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 50)];
        return view;
    }
}


返すビューの設定が終わりました。
次は、セクションヘッダの高さを返してあげましょう。


/*
 セクションの高さを指定する
 */
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    // 上部のテーブルのセクションヘッダはいらない
    if(tableView.tag == 0)
    {
        return 0;
    }
    else
    {
        return 54.0f;
    }
}


上記のメソッドはいずれもデリゲートメソッドです。
これで、テーブルごとに管理し、セクションを別でわけることができました。

セクションフッタに関しても同様に表示させなくすることができます。

2014年2月19日水曜日

xcode xibで作った部品を登録する方法

xcode xibで作った部品を登録する方法です。


xibで作ったtable cell 用の部品をtableviewに登録します。

// テーブルにxibを登録する
UINib *nib = [UINib nibWithNibName:@"xib名" bundle:nil];

[テーブルビュー名 registerNib:nib forCellReuseIdentifier:@"設定したセル名"];

2014年2月18日火曜日

xcode #pragma markについて

xcode #pragma markについてです。



ソースを落としてくると、よく見かけるのが#pragma mark

これがなんだか調べてみました。

これを書くと、この行以下の関数がfunction menuに注釈つきで
表示されるようになります。


意味がわからんと思うので、サンプルを...

#pragma mark - UITableViewDataSource

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    STSection *sectionObject = [_sections objectAtIndex:section];
    return sectionObject.rows.count;

}


UITTableViewDataSorceのデリゲートメソッド郡に対して、
#pragma markを記述します。

そうすると、



Function Menuに注釈が入って管理がしやすくなりました。
コードが長くなるから、導入するかどうかは好みですね。

2014年2月17日月曜日

xcode storyboard上でviewControllerをコピーする方法

xcode storyboard上でviewControllerをコピーする方法です。


copyしたいviewControllerを選択します。


command + c コピーコマンドを入力します。
そしてcommand + v のはりつけコマンドを入力します。


コピーされてますが、
貼付けると、viewcontrollerが重なっているので、
離してあげてください。

ios TableViewの線を消す方法、storyboard

ios TableViewの線を消す方法、storyboardです。

tableviewを引くと、セルとセルの間に線ができます。
それを消したり、長さを変えたりする方法です。


storyboardから変更したいテーブルビューを選択して、

Separator Noneにすると、区切りの線がなくなります。

Separator insetsをCustomにすると、線のサイズを変更することができます。

2014年2月16日日曜日

ios 画像をきれいにのばす方法

ios 画像をきれいにのばす方法です。


コードは、

UIImage *normalImage = [UIImage imageNamed:@"伸ばしたい画像名"];
UIImage *stretchImage = [normalImage stretchableImageWithLeftCapWidth:12    topCapHeight:12];


// ボタンにはりつけ    
[_loginBtn setBackgroundImage:stretchImage forState:UIControlStateNormal];


キモとなるのは、

stretchableImageWithLeftCapWidth:topCapHeight: 

で、画像の左上からピクセル数を指定しています。

これで、サイズにあわせてきれいに縮小してくれます。

2014年2月14日金曜日

xcode xib viewを縮めたり伸ばしたりする方法

xcode xib viewを縮めたり伸ばしたりする方法


xibの編集画面で、
viewを選択します。

Attribute Inspector → Size → Freeform

を選択してください。

するとビューの端をドラッグするとサイズを変更することができます。

2014年2月13日木曜日

ios -(id)initメソッドのひな形

NSObjectなどを継承した際の、初期化メソッドのひな形です。


- (id)init
{
    // おやを初期化する必要がある
    self = [super init];
    // 実態がある
    if (self) {
        
        
    }
    return self;

}

remember this!

ios UINavigationbarでStoryBoard内のViewContorollerにコードで遷移する方法

ios UINavigationbarでStoryBoard内のViewContorollerにコードで遷移する方法


状況は、ストーリーボード上に置いた、ビューコントローラーにNavigationController
を使って遷移したい状況。


まずは、遷移したいビューコントローラーに対して、identity Insectorから、
Story Board Idを入力する。



そして、遷移したい場所でコードを書く

// 任意のビュー
NextView *con = [self.storyboard instantiateViewControllerWithIdentifier:@"NextView"];
        
// 任意のViewControllerに遷移する
[self.navigationController pushViewController:con animated:YES];

以上です。

ios ストーリーボードでtableViewにTableViewCellをおいた際に、下に表示されてしまうのを解決する方法

ios ストーリーボードでtableViewにTableViewCellをおいた際に、下に表示されてしまうのを解決する方法です。


おそらくは、問題となるビューの前にNavigation Controllerをおいているはず。

ストーリーボード説明

TableViewCellが本来は真上におかれるはずなのに、
下におかれてしまっていますね。

解決方法は、

問題となっている大本のviewをクリックして、Attribute Inspectorをクリック
そして、Layout項目のAdfust Scroll View Insetsのチェックマークを外します。

attribute Inspector説明

これで、移動したい位置にいきました。


2014年2月12日水曜日

UIAlertViewのサンプル

UIAlertViewのサンプルです。


よく使うので、残しておく

UIAlertView *alert =
                            [[UIAlertView alloc] initWithTitle:@"title" 
                            message:@"message"
                            delegate:self 
                            cancelButtonTitle:@"ボタンのタイトル" 
                            otherButtonTitles:nil];
// アラートを表示させる
[alert show];


項目がいらない場合はnilで設定してあげれば出てきません。

objective-c NSString空文字判定

NSString空文字を判定する方法です。


NSString * str = @"jiji";
if([str length] != 0)
{
   // 空じゃないです。
}

文字列の長さでチェックすればいいですね。

delegateのprotocolを実装した時に、Cannot find protocol declaration for とでる

プロトコルでデリゲートを実装した時に、プロトコルが見つからないと出るエラーを直す方法です。

ただの循環参照が原因でした。
参照している元のviewのヘッダーを消してやると通るようになりました。

自分がわるい

ios navigationControllerからUIBarButtonItemから前の画面に戻る方法

ios navigationControllerからUIBarButtonItemから前の画面に戻る方法です。

意味がわからないと思うので、補足すると、
ナビゲーションバーを使って画面遷移をする時に、
デフォルトのナビゲーションアイテム(<や>がついているやつ)ではなくて、
UIBarButtonitemをストーリーボード上において、前の画面に遷移する方法です。


[self.navigationController popViewControllerAnimated:YES];



前の画面をpushして、出しているので、
単純にpopすればOK

2014年2月11日火曜日

TableViewでカスタムセルがタッチされた時の処理

TableViewでただのセルがタッチされるときは、セルの中身を取り出せましたが、
カスタムセルの場合に取り出し方がわからなかったので、書きます。

セルがタッチされたときに呼ばれる

didSelectRowAtIndexPath

内で、

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
        // 定義したカスタムセル
        UnpaidCell *cell = (UnpaidCell*)[tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:index inSection:0]];
        // 選ばれたセルだけ、カスタムセルに貼付けた画像を隠す
        if (indexPath.row == index) {
            cell.image.hidden = NO;
        }
}

ただ、カスタムセルに対して、キャストすればいいだけ。

2014年2月10日月曜日

TableViewでセルをスクロールさせない方法

TableViewでセルをスクロールさせない方法です。

まずはストーリーボードからです。


Attribute Inspecter にある
ScrollingのScrolling Enabledにチェックを入れてください。

UIimageViewに画像をはる方法

iosで画像を貼る方法です。

// imgフォルダに入れた画像を読み込む
UIImage *image = [UIImage imageNamed:@"ImageName"];
// 該当するUiImageに代入する
backImg.image = ImageName;


これで、画像が読み込まれます。

2014年2月9日日曜日

xcode,iosシュミレーターのサイズを変更する方法

iosシュミレーターの画面サイズを変更する方法です。

iosシュミレーターを選択した状態で、

macのナビゲーションバー → ウィンドウ → 表示サイズから変更できます。


最初はでかすぎるので、50%がちょうどよいです。