Ошибка при добавлении вида ввода в текстовое поле iOS 8
У меня возникла проблема, когда я добавляю пользовательское представление ввода в мое приложение на iOS 8. Это отлично работает на iOS 7, но при переключении на iOS 8 все не удается.
Это трассировка стека:
2014-06-03 21:23:54.237 MyApp[1910:47245] *** Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency', reason: 'child view controller:<UICompatibilityInputViewController: 0x1103f9d40>
should have parent view controller:<StopChooser: 0x11083e200> but requested parent is:<UIInputWindowController: 0x110858800>'
*** First throw call stack:
(
0 CoreFoundation 0x00000001042eee35 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x0000000103b919a0 objc_exception_throw + 45
2 CoreFoundation 0x00000001042eed6d +[NSException raise:format:] + 205
3 UIKit 0x00000001023d94cd -[UIViewController _addChildViewController:performHierarchyCheck:notifyWillMove:] + 184
4 UIKit 0x0000000102977a2b -[UIInputWindowController changeToInputViewSet:] + 416
5 UIKit 0x0000000102973f56 -[UIInputWindowController moveFromPlacement:toPlacement:starting:completion:] + 185
6 UIKit 0x000000010297826a -[UIInputWindowController setInputViewSet:] + 526
7 UIKit 0x0000000102973c97 -[UIInputWindowController performOperations:withAnimationStyle:] + 50
8 UIKit 0x00000001027559bb -[UIPeripheralHost(UIKitInternal) setInputViews:animationStyle:] + 1054
9 UIKit 0x0000000102422afd -[UIResponder becomeFirstResponder] + 468
10 UIKit 0x00000001023235d3 -[UIView(Hierarchy) becomeFirstResponder] + 99
11 UIKit 0x00000001029cdbfb -[UITextField becomeFirstResponder] + 51
12 UIKit 0x0000000102655d61 -[UITextInteractionAssistant(UITextInteractionAssistant_Internal) setFirstResponderIfNecessary] + 177
lib: terminating with uncaught exception of type NSException
(lldb)
Соответствующая часть - это несколько лучших строк. Может кто-нибудь объяснить это? Все, что я вызываю, это myTextview.inputView = keyboard
; Клавиатура - это UIView, созданная в раскадровке и связанная через IBOutlet.
Ответы
Ответ 1
Я столкнулся с этой проблемой раньше.
Проблема:
- Вы должны убедиться, что представление, которое вы присвоите
inputView
или inputAccessoryView
, не относится к родительскому виду. Когда вы создаете эти представления из xib внутри ViewController, по умолчанию они устанавливаются как субвью супервизора.
Советы по решению:
- Используйте метод
removeFromSuperview
в представлении, которое вы присвойте inputView
или inputAccessoryView
Ответ 2
Как раз перед becomeFirstResponder
удалите View, который вы используете для ввода из супервизора:
mTextField.inputView = mInputVeiw;
[mInputVeiw removeFromSuperview];
[mTextField becomeFirstResponder];
Надеюсь, что это поможет.
Ответ 3
Я понял это. Я не уверен, что проблема была раньше, но вместо того, чтобы связывать UIView
в конструкторе интерфейса, я вместо этого создал программный код UIView
, и он работал нормально.
Ответ 4
Я нашел решение, создающее UIView программным способом (как предложено Мило), но он падает, когда он используется как @property. В моем случае мне нужно было создать экземпляр UIPickerView в viewDidLoad и получить представление UITextView inputView. Когда мне нужно убрать pickerView, я получаю его так:
UIPickerView *picker = (UIPickerView *)self.myTextField.inputView;
Ответ 5
Да, решение Tuyen Nguyen не сработало для меня.
Что работало для меня в iOS8/XCode 6 для установки inputAccessoryView не для удаленияFromSuperview
НО
[[UIApplication sharedApplication].keyWindow addSubview:**MyViewToBeTheUIAccessoryView**];
Я надеюсь, что это поможет кому-то.
Ответ 6
Вы должны убедиться, что представление, которое вы назначаете для inputView
или inputAccessoryView
, не относится к какому-либо родительскому виду.
Эта ошибка особенно раздражает, поскольку любой "входной вид", созданный в раскадровке (и, таким образом, добавленный в VC view
), не может быть установлен как inputView
или inputAccessoryView
, не вызывая этого сбоя.
Если входное представление не добавлено в VC view
, представление ввода не будет доступно для визуального редактирования в раскладке построителя интерфейса. Он отображается только на левой панели раскадровки.
Как подключить Xcode Storyboard "Simulated Metrics" панели инструментов для фактического IBUutlet UIToolbar?
Я предпочел бы сделать подключение IB к inputAccessoryView
прямо в Раскадке. Это вызывает этот крах. Решение, которое я нашел, - сделать вторичный IBOutlet, подключенный к представлению в Раскадке, затем в viewDidLoad
удалить его из супер-представления, а затем сразу назначить inputAccessoryView
. Не уверен, что я в конечном итоге буду использовать это.
- (void) viewDidLoad {
// ...
[self.keybordView removeFromSuperview];
self.inputAccessoryView = self.keybordView;
}
Ответ 7
У меня была такая же проблема, когда я пытался настроить мой UIDatePicker в UITextField
- (void)setupViews {
...
dobField.inputView = aDatePicker; // Here was the problem
...
}
Мое решение, я просто "назначаю" и "запустил" мой datePicker в ViewDidLoad
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
...
aDatePicker = [[UIDatePicker alloc] init]; // My solution
...
}
Ответ 8
Вызов removeFromSuperView
в viewDidLoad
, похоже, не работает должным образом в модалях. Я закончил установку скрытого вида, а затем удалив его из superView в viewDidAppear
.
Ответ 9
Большинство ответов я был связан с изменениями кода. Я узнал, что удаление выхода в UIView внутри основного вида зафиксировано. fooobar.com/questions/106805/...
Ответ 10
Мое решение для этой проблемы состояло в том, чтобы добавить представление в inputView, но не добавлять контроллер представления в родительский.
Ответ 11
У меня была такая же ошибка, когда я возвращал любое представление из раскадровки как inputAccessoryView
. Я установил его с помощью childViewController. См. Мой ответ здесь.
Ответ 12
Моя проблема заключалась в том, что я назвал представление с текстовым полем inputAccessoryView...
@property (weak, nonatomic) IBOutlet CustomView *inputAccessoryView;
Ошибка:
Terminating app due to uncaught exception
'UIViewControllerHierarchyInconsistency', reason: 'child view
controller:<UICompatibilityInputViewController: 0x7fed7063a1a0> should
have parent view controller:<MyViewController: 0x7fed70606f00> but
requested parent is:<UIInputWindowController: 0x7fed710cde00>'
Решение:
Проверить именование; не переопределяйте, если не нужно.