【iOS】pickerViewを隠すには?

このQ&Aのポイント
  • 画面のどこかをタップすることでpickerViewを隠す方法
  • TextFieldの代わりにピッカーを出す方法
  • UIPickerViewを使用して選択肢を表示し、テキストフィールドの入力ビューとして設定する方法
回答を見る
  • ベストアンサー

【iOS】pickerViewを隠すには?

pickerViewを、画面のどこかをタップすることで隠すには どのようにすればよろしいでしょうか。 現在のコードです。 TextFieldの代わりにピッカーを出すという実装です。 ヘッダー @property(nonatomic,weak)IBOutlet UITextField *textField; @property(nonatomic,strong)UIPickerView *pickerView; @property(nonatomic,strong)NSArray *items; メイン - (void)viewDidLoad { self.items = @[@"A",@"B",@"C",@"D"]; self.pickerView = [[UIPickerView alloc]init]; self.pickerView.dataSource = self; self.pickerView.delegate = self; self.pickerView.showsSelectionIndicator = YES; self.textField.inputView = self.pickerView; [super viewDidLoad]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{ return 1; } - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{ return [self.items count]; } - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{ return [self.items objectAtIndex:row]; } - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{ self.textField.text = [self.items objectAtIndex:row]; } - (IBAction)pressHide:(id)sender{ [self.textField resignFirstResponder]; }

質問者が選んだベストアンサー

  • ベストアンサー
  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.2

あなたがやりたいであろうことを、いちからプログラムしてみました。あなたの書いたコードを添削したわけではありません。 ViewController.h ------------ #import <UIKit/UIKit.h> @interface ViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource> @end ViewController.m ------------ #import "ViewController.h" @interface ViewController () @property (retain, nonatomic) IBOutlet UITextView *myTextView; @end @implementation ViewController { NSMutableArray *datas; } - (void)viewDidLoad { [super viewDidLoad]; datas = [[NSMutableArray alloc] initWithObjects: @"ABC", @"DEF", @"GHI", @"JKL", nil]; UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame: CGRectMake(0.0, 0.0, 320.0, 200.0)]; pickerView.showsSelectionIndicator = YES; pickerView.dataSource = self; pickerView.delegate = self; UIToolbar *toolBar = [[UIToolbar alloc] initWithFrame: CGRectMake(0.0, 0.0, 320.0, 42.0)]; UIBarButtonItem *buttonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemDone target: self action: @selector(addString:)]; toolBar.items = [NSArray arrayWithObject: buttonItem]; _myTextView.inputView = pickerView; _myTextView.inputAccessoryView = toolBar; [toolBar release]; [buttonItem release]; [pickerView release]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (void)dealloc { [_myTextView release]; [datas release]; [super dealloc]; } // PickerView Delegates and Datasources - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { return 1; } - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { return datas.count; } - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { return [datas objectAtIndex:row]; } // Barbutton Item Action - (void)addString: (id)sender { UIPickerView *pickerView = (UIPickerView *)(_myTextView.inputView); _myTextView.text = [_myTextView.text stringByReplacingCharactersInRange: [_myTextView selectedRange] withString: [datas objectAtIndex: [pickerView selectedRowInComponent: 0]]]; [_myTextView resignFirstResponder]; } @end あなたのコードといちばん大きな違いは、アクセサリービューを設けて、そこに入力(Done)ボタンを付けたことです。ピッカーを回して、いちどで入力したいアイテムで止められるわけではないので、ピッカーを回して、Doneボタンで入力というインターフェイスにしました。 そのDoneボタンのアクションメソッドの中にピッカービューを隠すメソッド([_myTextView resignFirstResponder];)を書いています。 あなたのコードと比較しながら、目を通してもらえれば、幸いです。

Terutry
質問者

お礼

まったく新しいコードを書いていただき、大変参考になりました。 おっしゃる通りアクセサリービューを設けることで解決しました。 ありがとうございました!

その他の回答 (1)

noname#190876
noname#190876
回答No.1

隠すって。隠しても意味ないですが。 UITextField で、4択のUIPickerViewをカスタムインプットにして、選択し終わったら、UIPickerViewをくろずするのでしょ。  そのためには、UIPickerViewだけでは、クローズのボタンがないので、 UITextField.inputAccessoryView に、ボタン付きのUIViewか、UIToolBarをせっていします。 cf http://works.sabitori.com/2011/06/18/add-button-to-keyboard/ ボタンがおされて、pickerViewをクローズするには、  textfield に、resignFirstResponder を送るか、別のTextFieldに、becomeFirstResponder を送ります。

Terutry
質問者

お礼

UITextField.inputAccessaryViewに設定することで解決しました。 私の言葉足らずな文章を補っていただき感謝しています。 参考になるアドバイスをありがとうございました!

関連するQ&A

  • Objective-Cのエラーコードの意味

    タイトルの通りです。 エラー部分は最下部にあります。 ------------------------------------------------------------------------------------------------- // // ViewController.m // Kadai // // Created by on 2014/08/10. // Copyright (c) 2014年 saikoro. All rights reserved. // #import "ViewController.h" @interface ViewController () <UIAlertViewDelegate> @property (weak, nonatomic) IBOutlet UITextField *tfMyouji; @property (weak, nonatomic) IBOutlet UITextField *tfName; @property (weak, nonatomic) IBOutlet UILabel *Aisatsu; @end @implementation ViewController // 画面タッチ時 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ // キーボード非表示 [self.tfMyouji resignFirstResponder]; [self.tfName resignFirstResponder]; } - (void)viewDidLoad { [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. } // [挨拶する]ボタン押下 - (IBAction)introduce:(id)sender { UIAlertView *av = [[UIAlertView alloc]initWithTitle:@"確認" message:@"挨拶しますか?" delegate:self cancelButtonTitle:@"キャンセル" otherButtonTitles:@"はい", nil]; // 表示 [av show]; } // AlertViewボタン押下 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"再確認" message:@"本当に挨拶しますか?" delegate:nil cancelButtonTitle:@"やっぱりやめときます" otherButtonTitles:@"早く!", nil]; [av show]; } // AlertViewボタンさらに押下 + (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ // 入力された名前の保持 NSString *str = self.tfMyouji.text; ←ここでエラーが出ます。なぜか「tfMyouji」が                    予測で出てきません } @end ------------------------------------------------------------------------------------------------- どなたかエラーの理由をご教授頂けないでしょうか。 以上、何卒宜しくお願い致します。

  • swift言語 Xcode

    アプリを作る勉強をしています。参考書通りやりましたが、警告が出てしまいます。 原因がわからず困っています。どなたか助けて頂けませんでしょうか?宜しくお願い致します。 ソースはこちらです。 import UIKit import MapKit class ViewController: UIViewController ,UITextFieldDelegate { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. inputText.delegate = self } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBOutlet weak var inputText: UITextField! @IBOutlet weak var dispMap: MKMapView! } func textFildShoouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() let searchKeyword = textField.text print(searchKeyword) ⇦ここに警告が出ます。 return true

  • iosプログラムで背景色をコードで変更するには?

    xcodeでiphone用のアプリを作りたいと思い、プログラミングをやっています。 ラベルボタンを押したら背景色を変更するようなプログラムをしたいと思っています。 class ViewController : UIViewController { @IBOutlet weak var textfield: UITextField! @IBAction func sayhello(sender: AnyObject) { textfield.text = "Hello world!" } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } このhello worldをやった時に作成したプロジェクトを使用して、ボタンを押したら背景を任意の色(今回は黒)に変えたいと思っています。 それでこのクラス関数内にMystorlyboardウィンドウから背景を"control"ボタンをクリックしながら @IBOutlet var background: UIView! というのを追加しました。 そして、押すと"hello world"とテキストボックスに表示するボタンの処理の中に background.backgroundColor = Black としてみたのですが、エラーが出てビルドが成功しません。 (エラー内容)”Use of unresolved identifier ''Blue' この場合どのようにコードを修正するべきでしょうか? どうぞ、ご教示頂きますよう、よろしくお願い致します。 (現在のコード内容) import UIKit class ViewController: UIViewController { @IBOutlet var background: UIView! @IBOutlet weak var textfield: UITextField! @IBAction func sayhello(sender: AnyObject) { textfield.text = "Hello world!" background.backgroundColor = Blue } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }

  • TableViewでセル名が表示されない

    こんにちは。 iPhoneアプリの勉強している者ですが、TableViewControllerを使いセルごとに名前を表示させようとしているのですが、タイトルのみが表示されて肝心のセル名が表示されません。 appDelegate.mにてUINavigationControllerのインスタンス及びUITableViewControllerのインスタンスを作成してUITableViewControllerのインスタンスをrootViewControllerに設定しTableViewを表示させようとしています。 プログラムの記述のどこが間違っているのか教えて頂けると大変助かります。 以下UITableViewControllerのinterfaceセクションとimplementationセクションを掲載しますので、ご指摘お願いします。 #import <UIKit/UIKit.h> @interface SampleForSimpleTable : UITableViewController { NSArray *itemes; } @end @implementation SampleForSimpleTable - (id)initWithStyle:(UITableViewStyle)style { self = [super initWithStyle:style]; if (self) { // Custom initialization } return self; } - (void)viewDidLoad { [super viewDidLoad]; self.title = @"SimpleTable"; itemes = [[NSArray alloc] initWithObjects:@"ITME 1", @"ITEM 2", @"ITEM 3", @"ITEM 4", @"ITEM 5", @"ITEM 6", nil]; } #pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { #warning Potentially incomplete method implementation. // Return the number of sections. return 0; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { #warning Incomplete method implementation. // Return the number of rows in the section. return [itemes count]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *identifier = @"default-cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier ]; if (!cell){ cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; } cell.textLabel.text = [itemes objectAtIndex:indexPath.row]; // Configure the cell... return cell; }

  • [objective-C]配列について

    はじめまして。 objective-C、cocos2dについての質問です。 iPhoneアプリを勉強しながら作り始めたのですが詰まってしまい、できればご助力をお願いしたいと思い質問させていただきました。 cocos2dというフレームワークを使用し簡単なRPGを作りたいと考えております。 そこでキャラクターのステータスを配列に格納し、どのシーンからも参照したいのですが、どうしてもうまくいきません。 別クラスでインスタンス変数を作り、それを利用して配列を作成する方法で実装しようとしており、実際のコードは以下の通りになります。 ---------------------------------- <Character.h> @interface Character : NSObject{ NSInteger characterStateAtk_; ・(Def、Hpなど) ・ } @property (nonatomic, assign) NSInteger characterStateAtk;  ・  ・ @end <Character.m> #import "Character.h" @implementation Character @synthesize characterStateAtk = characterStateAtk_;  ・  ・ @end キャラクターステータス生成部分 <CreateScene.h> @interface CreateScene : CCScene { NSMutableArray* characterStateArray_; } @property (nonatomic, assign) NSMutableArray *characterStateArray; @end <CreateScene.m> @interface CreateScene() - (void) pressReloadButton:(id)sender; - (void) createCharacterState; @end @implementation CreateScene @synthesize characterStateArray = characterStateArray_; - (void) dealloc{ [self.characterStateArray release]; [super dealloc]; } - (void) createCharacterState{ self.characterStateArray = [NSMutableArray array]; Character* priState = [[[Character alloc]init] autorelease]; priState.characterStateAtk = random() % 5 + 5; ・ ・ [self.characterStateArray addObject:priState]; } (その他の処理) - (void) pressReloadButton:(id)sender{ [self createCharacterState];  (ここでcharacterStateArrayを取得して表示したい) } ---------------------------------- 最初は、 NSInteger x; x = [[self.characterStateArray objectAtIndex:0]intValue]; で取得しようとしたのですがエラーとなり実行できませんでした。 (調べていくうちにobjective-Cでは配列の中身はオブジェクトしか使えないという事を知りました) プログラム中の(ここでcharacterStateArrayを取得して表示したい)の部分について、実装方法や考え方についてご助言をいただけないでしょうか? よろしくお願いいたします。

  • iOSアプリのビルドエラー(初心者です)

    以下のサイトを参考に、動画の通りにプログラムを組んでみたのですが、参考サイトの通りビルドができず、Failedとなってしまいます。 http://dotinstall.com/lessons/basic_ios/4121 参考サイトのソースコードをそのまま貼り付けてもエラーを返されたのでXCodeのバージョンの問題かな?と思ったのですが、”Text”に変わるプロパティがわからず、困っています。 該当箇所のスクリーンショットを添付しましたので、もしおわかりになりましたら教えてください。よろしくお願いします。 MAC OS X 10.7.5 XCode: Version 4.6.3 // // ViewController.m // MyFourthApp // // Created by Test on 13/09/11. // Copyright (c) 2013年 com.test. All rights reserved. // #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [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. } - (IBAction)buttonPush:(id)sender { self.labelText.text = @"You Pushed Me!"; } @end

  • objective-cに関する質問です。

    objective-c初心者です。以下の参考書に載っていた初期化という処理についていまいち理解できません。 理解できない所は、何度も出てくるselfが何者なのか、というコトと、 [self.view addSubview:_textField]; このaddsubviewは何なのかということです。 調べても分からなかったので、親切な方教えて下さいますと幸いです。 よろしくお願い致します。 _____________________________ //初期化 - (void)viewDidLoad { [super viewDidLoad]; //テキストフィールドの生成 _textField=[self makeTextField:CGRectMake(10,20,300,32) text:@""]; [self.view addSubview:_textField]; //書き込みボタンの生成 UIButton* btnWrite=[self makeButton:CGRectMake(55,62,100,40) text:@"書き込み" tag:BTN_WRITE]; [self.view addSubview:btnWrite]; //読み込みボタンの生成 UIButton* btnRead=[self makeButton:CGRectMake(165,62,100,40) text:@"読み込み" tag:BTN_READ]; [self.view addSubview:btnRead]; }

  • Xcode TableView~詳細へ遷移について

    初めまして。 現在Xcodeにてアプリ開発中の初心者です。 現在、Tableviewのリストをタップしたら詳細なページへ遷移する、というものを作っております。 以下のサイトを参考にし、作成致しました。 http://www.raywenderlich.com/ja/34037/table-view%E3%81%ABsearch%E6%A9%9F%E8%83%BD%E3%82%92%E5%8A%A0%E3%81%88%E3%81%BE%E3%81%97%E3%82%87%E3%81%86 上記サイトで遷移するところまでは出来ましたものの、 詳細な情報をどう記載していいのかよくわからず、色々サイトなどを見てやってみたのですが実現出来ておりません。 こちらのyoutube動画を見ながら https://www.youtube.com/watch?v=lMVNoDEkrxk DetailViewController.hとDetailViewController.mを以下のように追加してみたのですが 駄目でした。 <DetailViewController.h> #import <UIKit/UIKit.h> @interface DetailViewController : UIViewController { IBOutlet UILabel *Built; IBOutlet UILabel *Height; IBOutlet UILabel *Type; IBOutlet UILabel *Visitation; } @property (strong, nonatomic) IBOutlet UILabel *candyArray; @property (strong, nonatomic) IBOutlet UILabel *filteredCandyArray; @property (strong, nonatomic) IBOutlet UIImageView *candySearchBar; @property (strong, nonatomic) NSArray *DetailModal; @end <DetailViewController.m> #import "DetailViewController.h" @interface DetailViewController () @end @implementation DetailViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. _candyArray.text = _DetailModal[0]; _filteredCandyArray.text = _DetailModal[1]; _candySearchBar.image = [UIImage imageNamed:_DetailModal[2]]; self.navigationItem.title = _DetailModal[0]; if ([_candyArray.text isEqualToString:@"chocolate bar"]) { Built.text = @"test1"; Height.text = @"test2"; Type.text = @"test3"; Visitation.text = @"test4"; } } @end どなたかご存知の方、お詳しい方教えて頂けませんでしょうか。 質問に慣れておらず、また知識が浅く質問方法や情報など不足しておりませんでしたら ご指摘頂けますと幸いです。

  • Xcode4のエラー(IPhoneアプリ)

    はじめまして。 IPhoneのアプリ作成に挑戦しています。 Xcode4のバージョンは 4.5.1です。 【はじめてのXcode4プログラミング】という参考書でIPhoneのカメラアプリを作る章があり、写真ライブラリから選択した画像を表示できるとのことです。 しかし、XcodeでRun(実行)すると、ViewController.mの最後2行【UIImage *originalImage =[info objectForkey:UIImagePickerControllerOriginalImage];】が赤くなり、【’dismissModalViewControllerAnimated’is deprecated: first deprecated in iOS 6.0】というエラー表示がでます。 全体のコードは下記の通りです。 ネットで調べてみましたが、解決方法がわかりません。 先に進めず困っています。 どうか解決方法を教えてください。 よろしくお願い致します。 ●ViewController.h// // ViewController.h // CameraApp // #import @interface ViewController : UIViewController - (IBAction)pressCameraButton:(id)sender; @property (weak, nonatomic) IBOutlet UIImageView *imageView; @end ●ViewController.m // // ViewController.m // CameraApp // #import “ViewController.h” @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [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. } - (IBAction)pressCameraButton:(id)sender { UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.delegate = self; picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; [self presentModalViewController:picker animated:YES]; } - (void)imagePickerController:(UIImagePickerController*)Picker didFinishPickingMediaWithInfo:(NSDictionary*)info { [self dismissModalViewControllerAnimated:YES]; UIImage *originalImage = [info objectForkey:UIImagePickerControllerOriginalImage]; self.imageView.image = originalImage; } @end

  • iPhone SDK・Xcode・Objective-cでのプロジェク

    iPhone SDK・Xcode・Objective-cでのプロジェクト共通定数クラスの定義について はじめて質問させていただきます。内容に不足あればすぐ修正しますのでご指摘ください。 当方iPhone SDK・Xcode・Objective-cを利用してアプリ開発をしています。 経験はCが我流で10年ほど、仕事ではjavaをメインに使っております。 それでアプリケーション全体から参照する定数を定義したいのですが使い勝手がいまひとつでして皆さんにご教示願いたい次第です。 javaではAppConst.javaというクラスファイルを作ってpublic const int NUMBER_ROW = 1と書き、 あとは使う側でその定数クラスをインクルードしておけば、AppConst.NUMBER_ROWという風に呼び出せたかと思います。(社内のフレームワークのおかげかもしれませんが…) Objective-cでも同様にしようと以下のように定数クラス AppConstを作りました。 #import <Foundation/Foundation.h> @interface AppConst : NSObject { NSInteger NUMBEROFFONT; } @property (nonatomic, assign) NSInteger NUMBEROFFONT; -------- #import "AppConst.h" @implementation AppConst @synthesize NUMBEROFFONT; -(id) init { self = [super init]; if (self != nil) { NUMBEROFFONT = 5; } return (self); } @end しかしこのクラスですと、参照側でインクルードするだけではなく、定数クラスのインスタンスを作らないと定数にアクセスできません。 #import "AppConst.h" (NSInteger) testMethod { AppConst *appConst = [[[AppConst alloc] init] autorelease]; return appConst.NUMBEROFFONT; } 使う度にインスタンスを作るのは面倒ですしメモリとしてもよくないように感じます。 もっと賢いやりかたがあればよろしくご教示のほどお願いします。

専門家に質問してみよう