#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. Также: используете ли вы блок (обработчик завершения) для запуска открытой панели?