2009-09-24 10 views
6

iphoneアプリでキーボードを起動することは可能ですか?または私は見えないテキストビューを持っている必要がありますか?iphoneキーボード(テキストビューなし)

もしそうなら、あなたはどのようにしてプログラムでテキストビューを作成し、キーボードを起動するのですか?(ユーザーはテキストビューをタップする必要はありません)私はインターフェイスビルダーを使用して見つけることができる唯一の例です。

+0

なぜテキストを入力する必要がない場合にキーボードを「持ち上げたいですか? –

+0

可能な複製[UITextFieldまたはUITextViewなしでUIKeyboardをプルする方法](http://stackoverflow.com/questions/1376120/how-to-pull-up-a-uikeyboard-without-a-uitextfield-or -uitextview) – JosephH

答えて

7

キーボードを表示する唯一の(有効な)方法は、最初の応答者であるテキストフィールドを持つことです。 非表示のテキストフィールドでbecomeFirstResponderを呼び出すことで、プログラムを非表示にして、プログラムレスにすることができます。このようなものが作品

あなたはこのような何かを行うことによって、プログラムUITextViewを作成することができます(aRectとビューが存在すると仮定)

var textView = [[[UITextView alloc] initWithFrame:aRect] autorelease]; 
[view addSubview:textView]; 

[textView becomeFirstResponder]; 
1

方法はNSNotificationCenterパブリッシュ/サブスクライブ・モデルを経由しています。まず、あなたは、あなたがthisをやって試すことができ、addObserver:selector:name:object:を使用する必要があります。

[[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:NSTextDidBeginEditingNotification object:self]]; 

しかし、私はあなたが得るだろう、またはキーボードのタイピングの文字値を取得するには、のために登録する必要がありますどのような通知はよく分かりません。幸運と幸せなハッキング:)

+0

これはどのようにしてキーボードを立ち上げますか? – klaaspieter

+0

私はそれが間違っているかどうかわからないが、その秘訣は投稿する正しい通知を見つけることである – slf

+0

多くのキーボード通知のものhttp://www.iphonedevsdk.com/forum/iphone-sdk-development/6275-add-toolbar-top -keyboard.html – slf

2

もう少し掘削の後、私はthisを見つけた。それは非公式だが、それはうまくいくと思う。

protocol KeyboardInputControlDelegate: class { 
    func keyboardInputControl(keyboardInputControl:KeyboardInputControl, didPressKey key:Character) 
} 

class KeyboardInputControl: UIControl, UIKeyInput { 

    // MARK: - properties 

    weak var delegate: KeyboardInputControlDelegate? 

    // MARK: - init 

    override init(frame: CGRect) { 
     super.init(frame: frame) 

     addTarget(self, action: Selector("onTouchUpInside:"), forControlEvents: .TouchUpInside) 
    } 

    required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    // MARK: - UIView 

    override func canBecomeFirstResponder() -> Bool { 
     return true 
    } 

    // MARK: - methods 

    dynamic private func onTouchUpInside(sender: KeyboardInputControl) { 
     becomeFirstResponder() 
    } 

    // MARK: - UIKeyInput 

    var text:String = "" 

    func hasText() -> Bool { 
     return text.isEmpty 
    } 

    func insertText(text: String) { 
     self.text = text 
     for ch in text { 
      delegate?.keyboardInputControl(self, didPressKey: ch) 
     } 
    } 

    func deleteBackward() { 
     if !text.isEmpty { 
      let newText = text[text.startIndex..<text.endIndex.predecessor()] 
      text = newText 
     } 
    } 
} 

使用例:

UIKeyboard *keyboard = [[[UIKeyboard alloc] initWithFrame: CGRectMake(0.0f, contentRect.size.height - 216.0f, contentRect.size.width, 216.0f)] autorelease]; 
     [keyboard setReturnKeyEnabled:NO]; 
     [keyboard setTapDelegate:editingTextView]; 
     [inputView addSubview:keyboard]; 
1

UIKeyInputはあなたの友達です。赤のビューをタップして、Xcodeのコンソール出力を参照してください。

class ViewController: UIViewController, KeyboardInputControlDelegate { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let kic = KeyboardInputControl(frame: CGRect(x: 0, y: 0, width: 100, height: 100)) 
     kic.delegate = self 
     kic.backgroundColor = UIColor.redColor() 
     view.addSubview(kic) 
    } 

    func keyboardInputControl(keyboardInputControl: KeyboardInputControl, didPressKey key: Character) { 
     println("Did press: \(key)") 
    } 
} 
1

UIKeyInputが解決の鍵となります。

protocol KeyboardInputControlDelegate: class { 
    func keyboardInputControl(keyboardInputControl:KeyboardInputControl, didPressKey key:Character) 
} 

class KeyboardInputControl: UIControl, UIKeyInput { 

    // MARK: - properties 

    weak var delegate: KeyboardInputControlDelegate? 

    // MARK: - init 

    override init(frame: CGRect) { 
     super.init(frame: frame) 

     addTarget(self, action: Selector("onTouchUpInside:"), forControlEvents: .TouchUpInside) 
    } 

    required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    // MARK: - UIView 

    override func canBecomeFirstResponder() -> Bool { 
     return true 
    } 

    // MARK: - methods 

    dynamic private func onTouchUpInside(sender: KeyboardInputControl) { 
     becomeFirstResponder() 
    } 

    // MARK: - UIKeyInput 

    var text:String = "" 

    func hasText() -> Bool { 
     return text.isEmpty 
    } 

    func insertText(text: String) { 
     self.text = text 
     for ch in text { 
      delegate?.keyboardInputControl(self, didPressKey: ch) 
     } 
    } 

    func deleteBackward() { 
     if !text.isEmpty { 
      let newText = text[text.startIndex..<text.endIndex.predecessor()] 
      text = newText 
     } 
    } 
} 

使用例。赤いビューをタップして、Xcodeコンソールの出力を確認してください:

class ViewController: UIViewController, KeyboardInputControlDelegate { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let kic = KeyboardInputControl(frame: CGRect(x: 0, y: 0, width: 100, height: 100)) 
     kic.delegate = self 
     kic.backgroundColor = UIColor.redColor() 
     view.addSubview(kic) 
    } 

    func keyboardInputControl(keyboardInputControl: KeyboardInputControl, didPressKey key: Character) { 
     println("Did press: \(key)") 
    } 
} 
関連する問題