Проблема с доступом к NSTextField из метода, вызываемого пользовательским представлением

#objective-c #cocoa #interface-builder

#objective-c #cocoa #interface-builder

Вопрос:

Я почти закончил писать программу для редактирования изображений, но столкнулся с проблемой, которая должна иметь простое решение.

По сути, я встроил набор кнопок и NSTextFields и пользовательский вид в основной xib, просто поместив их прямо из библиотеки в окно по умолчанию (а затем, конечно, связав их с IBOutlets и IBActions). Одна из кнопок — это кнопка «Открыть», которая вызывает функцию. Функция выполняет несколько действий: она запускает NSOpenPanel, а затем изменяет некоторые из NSTextFields (используется для изменения имени и пути изображения). Этот код вызывается следующим образом:

 - (IBAction)openButtonPressed: (id)sender {
    [self runOpenPanel];
}
 

Теперь я также запускаю свой обработчик keyDown из пользовательского представления, как я сказал ему acceptFirstResponder . (Я знаю, вероятно, это плохая практика — не писать отдельный класс контроллера, но это лучше оставить на другое время.) Итак, мое событие keyDown выглядит следующим образом (упрощенно, так как в имеющемся у меня коде есть операторы if для обработки определенных ключей отдельно, которые не относятся к этому вопросу):

 - (void)keyDown: (NSEvent *)theEvent {
    [self runOpenPanel];
}
 

Таким образом, они оба используют [self runOpenPanel] , но из разных контекстов. Проблема, с которой я сталкиваюсь, заключается в том, что «runOpenPanel» выполняет несколько вызовов для изменения IBOutlets, например:

 -(void)runOpenPanel {
    // Omitting some of the trivial NSOpenPanel code
    [myTextField setStringValue: @"The file name NSString from the aforementioned omitted code."];
}
 

Поэтому myTextField обновляется, когда функция запускается кнопкой конструктора интерфейса, но не при запуске обработчиком keyDown пользовательского представления. Есть ли какой-нибудь способ вызвать runOpenPanel, который позволит получить к нему доступ myTextField ? Я пробовал использовать [[super self] runOpenPanel] (не смейтесь) и ряд других вещей. Заранее спасибо!

Комментарии:

1. Подождите, почему вы показываете открытую панель в keyDown? Вы реагируете на команду O или что-то в этом роде?

2. Также: используете ли вы блок (обработчик завершения) для запуска открытой панели?