2009-11-20
■[iPhone] iPhoneアプリ用のログイン情報設定画面の作り方
注:本記事の方法ではパスワードが安全に保管されないようです。より安全に保管する方法を記載しました。(「iPhoneアプリ用のログイン情報設定画面の作り方(その2)」)。
TwitterやFacebook等のサービスと連携するiPhoneアプリを作る場合、ユーザーにそれらのサービスへのログイン情報を設定してもらう必要が出てくる事が多い。そこでUITableViewを使ってユーザ名とパスワードを入力するログイン情報設定画面の作り方を以下に記載する。
実際に作るのは以下のような設定画面。"Grouped"スタイルのUITableViewを使用する。
上記の画面はUITableViewの各セルの中に、UILabelとUITextFieldを埋め込むという形になる。
例えばUITableViewを管理するコントローラクラスをUserInfoSettingControllerとすると以下のような形になる。
UITextFieldDelegateプロトコルを実装しているのは、ユーザがUITextFieldに入力したアクションを拾うため。
@interface UserInfoSettingController : UITableViewController <UITextFieldDelegate> { } @end
ポイントとしては以下。
- ユーザのログイン情報はNSUserDefaultsを使用して保存する
- UITextFieldDelegateプロトコルのtextFieldDidEndEditingでユーザの入力終了を検知する
- ユーザが入力したUITextFieldがユーザ名かパスワードかはtagで判別する
@implementation UserInfoSettingController *snip* - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; cell.selectionStyle = UITableViewCellSelectionStyleNone; UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(10, 6, 100, 30)] autorelease]; label.font = [UIFont boldSystemFontOfSize:18]; UITextField *textField = [[[UITextField alloc] initWithFrame:CGRectMake(110, 10, 150, 30)] autorelease]; textField.returnKeyType = UIReturnKeyDone; // ReturnキーをDoneに変える textField.delegate = self; textField.tag = [indexPath row]; // ユーザが既に設定済みであればその情報を表示する NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; if ([indexPath row] == 0) { label.text = @"Username"; textField.text = [defaults objectForKey:@"USERNAME"]; } else if ([indexPath row] == 1) { label.text = @"Password"; textField.secureTextEntry = YES; // パスワードを画面に表示しないようにする textField.text = [defaults objectForKey:@"PASSWORD"]; } [cell.contentView addSubview:label]; [cell.contentView addSubview:textField]; } return cell; } - (void)textFieldDidEndEditing:(UITextField *)textField { // 入力された情報をセーブする NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; if (textField.tag == 0) { [defaults setObject:textField.text forKey:@"USERNAME"]; } else if (textField.tag == 1) { [defaults setObject:textField.text forKey:@"PASSWORD"]; } } - (BOOL)textFieldShouldReturn:(UITextField *)textField { // キーボードを隠す [textField resignFirstResponder]; return YES; } *snip* @end
トラックバック - http://d.hatena.ne.jp/tomute/20091120/1258780317
リンク元
- 770 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CC8QFjAA&url=http://d.hatena.ne.jp/tomute/20091120/1258780317&ei=idA5T5SpIKaKmQXkupmWCw&usg=AFQjCNFFMv4n3X04oMFrszzvAz5KBhDEFA&sig2=3Aag13gCjyg_-W5va7yZWw
- 507 https://www.google.co.jp/
- 489 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CDkQFjAB&url=http://d.hatena.ne.jp/tomute/20091120/1258780317&ei=ebAvT6-2OayUmQXDkpnGDw&usg=AFQjCNFFMv4n3X04oMFrszzvAz5KBhDEFA
- 480 http://www.google.co.jp/url?sa=t&rct=j&q=uitextfielddelegate&source=web&cd=1&ved=0CBsQFjAA&url=http://d.hatena.ne.jp/tomute/20091120/1258780317&ei=cg2ETqXwMa3RiALWq5XSDA&usg=AFQjCNFFMv4n3X04oMFrszzvAz5KBhDEFA&sig2=_-hm-8FGGSEjvUh02CALxw
- 261 http://www.google.co.jp/search?client=safari&rls=en&q=uitextfield+password&ie=UTF-8&oe=UTF-8&redir_esc=&ei=k9zPS_26DNCGkAW41_T-CQ
- 216 http://sarudeki.maiway.jp/forum/topic/629
- 195 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&cts=1330848976254&ved=0CDcQFjAC&url=http://d.hatena.ne.jp/tomute/20091120/1258780317&ei=yiRTT62sBIrmmAWg_tiZCg&usg=AFQjCNFFMv4n3X04oMFrszzvAz5KBhDEFA&sig2=UaYO1LrdRaLz2imvOd5dJA
- 172 http://www.google.co.jp/url?sa=t&source=web&cd=1&ved=0CBkQFjAA&url=http://d.hatena.ne.jp/tomute/20091120/1258780317&rct=j&q=notes ログイン画面 ユーザー名&ei=7tSvT
- 142 http://www.google.co.jp/search?q=UITextFieldDelegate&ie=utf-8&oe=utf-8&aq=t&hl=ja&esrch=FT1
- 121 http://www.google.co.jp/search?sourceid=chrome&ie=UTF-8&q=UITextField+UITableView



