2012-02-09 3 views
4

У меня есть UIView подкласса, который я задаю в текстовом поле следующим образом:Пользовательская клавиатура на iOS: как мне получить доступ к UITextField?

self.textField.inputView = [[HexKeyboard alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; 

и это работает (то есть, клавиатура идет вверх). Однако, как должен знать HexKeyboard об textField?

[Конечно, я могу добавить собственность к HexKeyboard для достижения этой цели (и назвать его delegate), но я полагаю, есть встроенный механизм для этого ...]

ответ

1

Похоже, для этого нет встроенного механизма, как указывали другие ответчики. Как говорит Ник, для этого вам не нужен сложный шаблон делегирования. Вернее, вы используете шаблон делегата, но вы получаете класс делегата бесплатно. В этом случае это протокол UITextInput.

Так что ваша клавиатура, вероятно, выглядит следующим образом (и имеет СИБ)

@interface ViewController : UIViewController 

// use assign if < iOS 5 
@property (nonatomic, weak) IBOutlet id <UITextInput> *delegate; 

@end 

При создании контроллера клавиатуры, вы назначаете UITextInput конформера к нему, так что-то вроде этого:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    HexKeyboardController *keyboardController = [[HexKeyboardController alloc] initWithNibName:@"HexKeyboardController" bundle:nil]; 
    self.textField.inputView = keyboardController.view; 
    keyboardController.delegate = self.textField; 

} 

Однако я думал, что ДОЛЖЕН быть способ определить эту клавиатуру только один раз и заставить клавиатуру «автоматически знать», кто вызвал ее объект UITextInput. Но я огляделся безрезультатно ... вы не можете понять, кто такой firstResponder, если вы не троллируете иерархию представлений самостоятельно или не сохраняете своих делегатов в списке (что вызовет цикл сохранения). Плюс, это не так плохо, потому что HexKeyboardController также выгрузит, когда отменяется textField.

+0

Я не получаю комментарий «use assign if

+0

Привет @NickLockwood, я победил тебя до удара на 24 секунды на моем редактировании :) Серьезно, мои извинения, мой код был неправильным. –

+1

Хе-хе, проклятая клавиатура iPhone - слишком медленная, чтобы вводить комментарии! –

0

Я не верю, что есть встроенный механизм для этого, вы, вероятно, хотите, чтобы делегат на шестнадцатеричной клавиатуре получал от него «нажатия клавиш», а затем добавлял его в текстовое поле или что бы вы там ни делали.

3

Вы дона Для этого действительно нужен сложный шаблон делегирования. Просто создайте свойство типа UITextField на классе HexKeyboard, и сделать его unsafe_unretained ссылки, так что вы не получите сохранить цикл:

@interface HexKeyboard 

@property (nonatomic, unsafe_unretained) UITextField *textField; 

@end 

Затем установите его, когда вы установите inputView:

self.textField.inputView = [[HexKeyboard alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; 
self.textField.inputView.textField = self.textField; 
+0

Почему 'unsafe_unretained' вместо слабых? –

+0

Слабый только iOS5. Если вы планируете поддерживать iOS5, вместо этого используйте слабый. Если вам нужно поддерживать iOS4, используйте unsafe_unretained. –

+1

Спасибо. В чем преимущество над 'assign', которое также работает на iOS4? –

Смежные вопросы