Как вызвать метод в классе ViewController из одного из его подпредставлений?

Я хотел поднять клавиатуру без использования текстового поля, поэтому я создал подкласс UIToolbar и привел его в соответствие с протоколом UIKeyInput. Основываясь на моих тестах с использованием простых распечаток NSLog, я успешно читаю ввод ключа от пользователя. Моя проблема в том, что мне нужен текст, который вводится на клавиатуре, чтобы обновить табличное представление, которое управляется тем же контроллером представления, что и моя пользовательская панель инструментов. По сути, мой вопрос заключается в следующем: если мой метод обновления находится в моем собственном классе панели инструментов, как мне сказать ему обновить представление таблицы? Или, если мой метод обновления находится в моем классе контроллера представления, как я могу убедиться, что он вызывается при каждом нажатии клавиши?

Я попытался, чтобы моя панель инструментов отправляла уведомление при нажатии клавиши, вот так:

- (void)insertText:(NSString *)text {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"keyPressed" object:self];

и впоследствии слушать его с помощью контроллера представления

[[NSNotificationCenter defaultCenter] addObserver:self 
    selector:@selector(updateForKeyPressed:) name:@"keyPressed" object:nil];

...

- (void)updateForKeyPressed:(NSNotification *)note {
   [self update];
}

Это не сработало, но это не было сюрпризом, так как я получил идею из онлайн-статьи, и я вполне уверен, что я делаю это неправильно. На этом этапе я в значительной степени нажимаю на кнопки, и было бы здорово, если бы кто-то указал мне правильное направление. Как всегда, любая помощь очень ценится. Если кто-то захочет увидеть больше моего кода, дайте мне знать, и я могу опубликовать его.

2 ответа

Использование уведомлений должно работать нормально. Что вы сделали для отладки вашего кода? Вы уверены, что уведомление публикуется? Вы уверены, что контроллер представления зарегистрировался в центре уведомлений? Вы уверены, что -updateForKeyPressed: не вызывается?

Делегирование - это еще один вариант, который может быть проще настроить и отладить. Настройте контроллер представления в качестве делегата панели инструментов, и пусть панель инструментов отправляет сообщение своему делегату всякий раз, когда изменяется его текст, как это делает UITextView.

Основная идея, которую нужно иметь в виду, состоит в том, что ваши представления не должны заботиться о контроллере представления. Может случиться, что панель инструментов отправляет сообщения в контроллер представления, поскольку контроллер представления является его делегатом, но она не должна полагаться на тот факт, что его делегат является контроллером представления.

Вы должны иметь возможность заставить контроллер представления соответствовать uikeyinput, а затем установить делегата панели инструментов на view controller

Другие вопросы по тегам