Как вызвать метод в классе 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];
}

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


person Sam Hazleton    schedule 07.03.2012    source источник
comment
Просто мое предположение [((MyViewController *)[[myToolBar superview] nextResponder]) update]   -  person anticyclope    schedule 07.03.2012
comment
Я неправильно прочитал ваш комментарий в первый раз и пропустил вызов nextResponder. Это успешно вызывает метод обновления, но действия внутри метода не выполняются. Я обновлю свой вопрос, чтобы отразить реальный источник ошибки. кстати спасибо.   -  person Sam Hazleton    schedule 07.03.2012


Ответы (2)


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

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

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

person Caleb    schedule 07.03.2012
comment
После того, как я вернулся и попробовал способ антициклопа, я понял, что отправляемое уведомление вообще не было проблемой. Методы вызывались (и вызываются). Панель инструментов и контроллер представления на самом деле нормально взаимодействуют. Однако табличное представление не отвечает ни на настройку кадра, ни на обновления массива. Кстати, я не знал, что вы можете сделать это для панели инструментов, поскольку на панели инструментов нет метода setDelegate. Спасибо за помощь - я всегда ценю понимание. - person Sam Hazleton; 07.03.2012
comment
@SamHazleton Вы сказали, что у вас есть подкласс UIToolbar, поэтому вы можете легко добавить делегата самостоятельно. - person Caleb; 07.03.2012
comment
@SamHazleton Объявите свойство delegate в подклассе панели инструментов и синтезируйте средства доступа (или нет). При необходимости объявите протокол с объявлениями методов, которые должен реализовать ваш делегат панели инструментов. Если вы это сделаете, вы можете объявить свое свойство делегата как принимающее этот протокол: @property(strong) id<MyProtocol> delegate;. - person Caleb; 07.03.2012

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

person meggar    schedule 07.03.2012
comment
Спасибо, я не знал, что так можно. На самом деле это понятие немного беспокоит, учитывая объем работы, который я проделал, пытаясь сделать это таким образом. - person Sam Hazleton; 07.03.2012