スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


このエントリーをはてなブックマークに追加

テキストフィールド(UITextField)でキーボードを閉じる

テキストフィールドをタッチするとソフトウェアキーボードが表示されるが、コントロールを追加しただけの初期状態では、キーボードを非表示にすることができない。

これを回避するためには、テキストフィールドでリターンキーが押されたイベントをキャッチし、その中でキーボードを非表示にする処理を行えば良い。

まず最初に、ビューが読み込まれたタイミングで、テキストフィールドのデリゲートにビューコントローラを設定する。

- (void)viewDidLoad {
  [super viewDidLoad];
  // テキストフィールドのデリゲートを設定
  txtComment.delegate = self;
}

※txtCommentはテキストフィールドのアウトレットとする

続いて、ビューコントローラに<UITextFieldDelegate>インターフェースを実装する。

@interface XXXXViewController : UIViewController <UITextFieldDelegate> {
  :
  :
}


そして、キーボードで[Return]キーを押した時に呼び出される関数を定義する。
この中でキーボードを非表示にする処理を追加すれば完了~。

// メッセージ入力終了処理
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
  // the user pressed the "Done" button, so dismiss the keyboard
  // キーボードを非表示にする
  [textField resignFirstResponder];
  return YES;
}


ついでに、Interface Builderで「Return Key」を「Done」にしておけば、キーボードのリターンキーが「閉じる」に変更される。

このエントリーをはてなブックマークに追加

テーマ : プログラミング
ジャンル : コンピュータ

コメント

非公開コメント

キーボードを表示したままのとき

はじめまして。こちらでの情報がとても役立っています。

質問なのですがキーボードを表示したまま、アプリを終了し、
また立ち上げるとキーボードが表示されたままになってしまいます。

これをさせない方法はありますでしょうか?

バックグラウンド移行時の話でしょうか?

コメントありがとうございます。
現在実家に帰省中で、確認手段がないので間違っていたらすみません。

アプリを起動(再起動)した直後は、意図的にキーボードを表示させない限り、非表示になっていると思います。
だとすると、「アプリを終了」というのは、HOMEボタンでバックグラウンドに移行した時の話でしょうか?
その場合、バックグラウンドに移行する直前に呼び出されるapplicationDidEnterBackgroundメソッドを実装して、そこで
[textField resignFirstResponder];
を呼べば良いかと。

・・・と、見当違いな回答だったらすいません。

HOMEボタンを押したときです。

タイトルの通りアプリをHOMEボタンを押してアプリを終了し、またアプリを立ち上げたときに前回終了時にキーボードを表示したまま終了しているとキーボードが出たままになります。

そしてコメントで教えていただいた applicationDidEnterBackground に
resignFirstResponder ですがUITextViewなどを使用しているファイルに追加してみましたが非表示になりませんでした。
AppDelegateに使用しないとダメでしょうか?

サンプルを作ってみました

>AppDelegateに使用しないとダメでしょうか?
TextView/TextFieldを使用しているクラスにキーボードを閉じるメソッドを作成して、AppDelegateのapplicationDidEnterBackgroundから呼び出せば実現できると思います。

一応サンプルを作ってみましたが、実現したい内容と合っていますか?

http://araking.hustle.ne.jp/app-sample/TextViewTest2.zip

サンプルを使いましたが・・・

うまく行きません。
自分のプログラムの作り方はrootViewControllerをAppDelegateに使用し、rootViewControllerの中でしたい動作の画面に分ける。
ということをしているせいか、UITextViewを使用しているところで
キーボード閉処理を作りapplicationDidEnterBackgroundに入れても、
次回表示時にはキーボードが出たままになります。

仕様としては下記のような感じです。
HOME画面→UITextView使用画面
この2つにViewControllerとXibがあります。
これをrootViewControllerに作ったMainViewContreollerの中で動かしています。

AppDelegateには以下のように作りました。
//キーボードを閉じる
[tvcController closeTwittVCKeyboard];
@classやimportもしているのですがうまく行きません。
NSLogで確認したところ、この処理に来ていませんでした・・・。

ダメですか・・・

ダメですか・・・。

>うまく行きません。
まず、サンプルプログラム自体は期待している動きをしていますか?

>NSLogで確認したところ、この処理に来ていませんでした・・・。
つまり、applicationDidEnterBackgroundが呼ばれていないということですよね?

>HOME画面→UITextView使用画面
画面とビュー構成がイマイチ把握できていないのですが、
 【画面1】HOME画面(=rootViewController)
 【画面2】UITextView使用画面(=MainViewContreoller)
ということですかね?まぁ、applicationDidEnterBackgroundが呼ばれないこととビューの構成はあまり関係がない気がします。

念のため、基本的な確認なのですが、マルチタスク非対応の環境ではないですよね?具体的には、
 ・SDKのバージョンが4.0未満
 ・検証環境がiOS4.0未満(実機の場合)
 ・検証環境がiPhone3GまたはiPod touch第2世代以下(実機の場合)
 ・.plistを編集して、マルチタスク機能をOFFにしている
上記のいずれにも該当しないですよね?

applicationDidEnterBackgroundが呼ばれない原因はこのくらいしか思いつかないのですが・・・多分違いますよね。

あまり期待はできませんが、現在のプログラムコードの要らない部分を削ってメールか何かで送ってもらえれば、もう少し追求できるかもしれません。(あまり深追いはできませんが)
もしくは、Twitterのiphone_dev_jpで質問してみるのも手かもしれないですね。
http://twitter.com/iphone_dev_jp

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

Re: 一応こういう状態です。

サンプルプログラムを確認しました。
twittcloseのポインタがnilになっているため、そのメソッドcloseTwittVCKeyboardが呼ばれていないようです。メンバ変数が宣言されただけでインスタンスが設定されていないので、その辺りを見直す必要があると思います。

ただ、プログラムの構造上、TwitterVCクラスのインスタンスはDelegateクラスから参照しづらいので工夫が必要だと思います。

とりあえず、twittclose変数を使わないで強引に修正してみました。


(1)closeTwittVCKeyboardの呼び出しコードを変更
[TextViewAppliAppDelegate.m]

//[twittclose closeTwittVCKeyboard]; // 削除
if (rootViewController.mainViewController != nil) {
 if (rootViewController.mainViewController.twitter != nil) {
  [rootViewController.mainViewController.twitter closeTwittVCKeyboard];
 }
}


(2)MainViewControllerのメンバ変数twitterはprivateなので、publicにする。
[MainViewController.h]

@interface MainViewController : UIViewController{
 :
 :
 TwitterVC* twitter;
}

 :
 :
@property(nonatomic,retain)TwitterVC* twitter;

※MainViewController.mの宣言は削除する

こんな感じにすれば取り敢えずは動作します。もっとスマートなやり方もありそうですが・・・。

出来ました!

おかげさまで無事キーボードを閉じることが出来ました。
TextViewだけでなくSearchBarのキーボードも閉じることが確認できました。
助けていただきありがとうございました。

あらたな問題が・・・

TextViewの件ありがとうございました。

ですが今度は別の問題が出てきてしまいました。
YouTubeのような動画一覧を縦で表示し動画の再生は横で行う
ということを行いたいのですが、動画を自動で横表示したいのですがうまく行きません。
CGAffineを使うと最大サイズで再生したときに指でピンチを行うと
縦表示に戻ってしまうので別の方法を探しています。

未知の分野なので・・・

>縦表示に戻ってしまうので別の方法を探しています。
動画関連の開発はやったことがないので、全く想像が付かないですね~。ちょっと力になれそうにないです。すみません・・・。
iPhoneアプリ紹介
パズルナビ for パズドラ 2016
最強のコンボツール!
colorization-large-icon.png

スクリーンショットを読み込むとコンボを自動計算してくれるパズドラの攻略アプリです。


AirRuler
(簡易距離計)

リモートで簡単に距離を測定できるアプリ!
colorization-large-icon.png

目標地点に向けてiPhoneを傾けるだけで簡単に距離を測定できます。ゴルフの距離測定機能付きパターの代わりにも使えます。


補色残像アート
~見えない色が見えてくる~
白黒なのにカラーに見えてしまう不思議な映像を体験しよう!
colorization-large-icon.png

補色残像という目の錯覚を利用して、白黒写真がカラーに見える不思議な映像を作成できます。作成した映像は、アニメGIFに変換したり、Twitterに投稿することもできます。


タイピング革命
フリック練習はタイピング革命で!ネットランキングで盛り上がろう!
icon-l-typing.jpg

オンラインランキング上のプレイを閲覧できるリプレイ機能付き!フリック入力とローマ字入力に完全対応したタイピング練習アプリです。初心者も安心のトレーニングモード付き。

★なんと!あのAppBank様に紹介して頂きました!!
typing-sale-led.gif


簡単3Dカメラ
iPhoneで手軽に3D写真を楽しもう!平行法/交差法/アナグリフ/グラグラ3Dに対応。
icon-l-3d.jpg

2枚の写真を撮影するだけで、裸眼で立体視できる3D写真が作成できます。85円でステレオ写真もアナグリフも楽しめるのは簡単3Dカメラだけ!

プロフィール

あらきんぐ☆

Author:あらきんぐ☆
はじめまして。あらきんぐです。
4月からiPhoneを購入し、その魅力に取り付かれて、気がついたらアプリ開発の道へ!仕事でプログラム開発をしていますが、基本「動けばOK!」な適当エンジニアです。適当でもアプリは作れる!っていう事を、ブログを通じて証明していきたと思います。

最新記事
最新コメント
最新トラックバック
カテゴリ
FC2カウンター
全記事表示リンク

全ての記事を表示する

Twitter
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
アクセスランキング
[ジャンルランキング]
コンピュータ
388位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
49位
アクセスランキングを見る>>
オススメ商品
iPhone/iPodと一般オーディオを繋ぐ貴重なアイテム!
アプライドオリジナルアイテム MBB...

アプライドオリジナルアイテム MBB...
価格:3,980円(税込、送料別)

開発中級者にオススメ!「こんなことができるんだ!」と驚かされる一冊
【送料無料】iPhone...

【送料無料】iPhone...
価格:1,500円(税込、送料別)

安い!シンプル!カッコいい!
希少なiPhone対応キーボード内蔵ケース
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。