Функция обратного вызова MATLAB: неопределенная функция?

У меня есть группа кнопок с 3 переключателями внутри, а также раздел дисплея.

Эффект, который я хочу, заключается в том, что после выбора переключателя раздел дисплея также меняется.

Я реализую это с помощью класса и добавляю SelectionChangedFcn при создании этих компонентов:

app.ControlButtonGroup.SelectionChangedFcn = {@controlBtnGroupSelectionChanged, app}

Я определяю функцию controlBtnGroupSelectionChanged(obj, eventData, app) в том же файле, где сохранен файл функции createComponents.m.

Но когда я нажимаю другое радио, сообщения об ошибках выглядят следующим образом:

Неопределенная функция «controlBtnGroupSelectionChanged» для входных аргументов типа «matlab.ui.container.ButtonGroup». Ошибка при оценке ButtonGroup SelectionChangedFcn

Я также объявляю функцию controlBtnGroupSelectionChanged как закрытый метод в своем классе.

Функция controlBtnGroupSelectionChanged выглядит следующим образом:

function controlBtnGroupSelectionChanged(obj, eventData, app)
% Update display section as the radio button in control section is changed

    %new = app.ControlButtonGroup.NewValue;
    new = obj.SelectedObject.String;
    switch new
        case 'Transfer Path'
            % display the transfer path
            imagesc(app.curImage,'Parent',app.DisplayPath);
            app.DisplayPath.Visible = 'off';
        case 'Store'
            % display the store text
            text(curStore,'Parent',app.DisplayPath);
        case 'Mill'
            % Display the Mill text
            text(curMill,'Parent',app.DisplayPath);
    end
end

Часть того, что определено в классе, выглядит следующим образом:

methods (Access = private)

    % Create UIFigure and components
    createComponents(app);

    % Callback function for Control Button Group Selection Changed
    controlBtnGroupSelectionChanged(obj, eventData, app);

end

И часть, связанная с этим в функции createComponents:

    app.ControlButtonGroup = uibuttongroup(app.UIFigure);
    app.ControlButtonGroup.Title = 'Control';
    app.ControlButtonGroup.FontSize = 16;
    app.ControlButtonGroup.Units = 'Normalized';
    app.ControlButtonGroup.Position = [0.45 0.75 0.45 0.2];
    app.ControlButtonGroup.SelectionChangedFcn = {@controlBtnGroupSelectionChanged,app};

Почему он говорит, что моя функция не определена?

ОБНОВЛЕНИЕ: я просмотрел некоторые другие демонстрации и изменил обратный вызов как app.ControlButtonGroup.SelectionChangedFcn = @(h, e)controlBtnGroupSelectionChanged(app). И определите (также прототип) его так же, как controlBtnGroupSelectionChanged (приложение). Тогда это работает. поэтому я предполагаю, что проблема должна заключаться в количестве параметров, но я до сих пор не нахожу подробной информации об этом. Любые подсказки приветствуются!!


person Michelle Shieh    schedule 18.08.2016    source источник
comment
Вы уверены, что у вас нет опечатки в имени вашей функции? Также было бы полезно для вас опубликовать фактический файл.   -  person Suever    schedule 18.08.2016
comment
Да, я скопировал имя на всякий случай, если я не сделал опечаток. И я только что дважды проверил это   -  person Michelle Shieh    schedule 19.08.2016
comment
Мне интересно, может ли возникнуть проблема с вызовом частного метода из другого частного?   -  person Michelle Shieh    schedule 19.08.2016
comment
Когда я набираю, какой controlBtnGroupSelectionChanged в командной строке MATLAB, он показывает метод C:\Users\mxie\Desktop\AnalyticalEngine(OOP)\@DisplayPanel\controlBtnGroupSelectionChanged.m % DisplayPanel. Так было определено и должно быть признано.   -  person Michelle Shieh    schedule 19.08.2016
comment
Добавлен ответ и описание ниже.   -  person Suever    schedule 19.08.2016


Ответы (1)


На самом деле вам нужно предоставить объект в качестве первого аргумента функции, чтобы MATLAB знал, что его нужно искать как метод app.

app.ControlButtonGroup.SelectionChangedFcn = @(s,e)controlBtnGroupSelectionChanged(app, s, e);

% Or this way which implicitly passes the two input parameters

app.ControlButtonGroup.SelectionChangedFcn = @app.controlBtnGroupSelectionChanged;

Тогда ваш метод будет выглядеть так

function controlBtnGroupSelectionChanged(obj, source, event)

Если вам не нужны source (дескриптор группы кнопок управления) или event (данные события, связанные с событием выбора), вы можете сделать так, чтобы ваш обратный вызов «игнорировал» эти второй и третий входы, выполнив что-то вроде

app.ControlButtonGroup.SelectionChangedFcn = @(s,e)app.controlBtnGroupSelectionChanged();

И ваш метод будет выглядеть так

function controlBtnGroupSelectionChanged(app)
person Suever    schedule 19.08.2016
comment
Спасибо! Какие параметры я должен определить тогда. controBtnGroupSelection(app) или ничего? - person Michelle Shieh; 19.08.2016
comment
@MichelleShieh Это зависит от того, нужны вам первые два параметра или нет. Я обновил с объяснением - person Suever; 19.08.2016
comment
Большое спасибо! Вы прекрасно решили мою проблему! Просто интересно, зачем нам нужны (s, e) перед вызовом? Предварительно что-то? Есть ли какое-либо объяснение концепции/документация о них? - person Michelle Shieh; 19.08.2016
comment
@MichelleShieh Все обратные вызовы uicontrol автоматически передают два входных аргумента обратному вызову. @(s,e) принимает два обратных вызова, но затем не передает ни один из них в вашу функцию. Дополнительная информация в этом ответе - person Suever; 19.08.2016