Подтвердить что ты не робот

Ошибка при добавлении вида ввода в текстовое поле 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.

4b9b3361

Ответ 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>'

Решение:

Проверить именование; не переопределяйте, если не нужно.