Осуществляйте обмен данными среди обратных вызовов

Можно записать функции обратного вызова для компонентов пользовательского интерфейса в приложении, чтобы задать, как оно ведет себя, когда пользователь взаимодействует с ним. (Для получения дополнительной информации о функциях обратного вызова в приложениях смотрите Запись обратных вызово для приложений, созданных программно.)

В приложениях с несколькими взаимозависимыми компонентами пользовательского интерфейса функции обратного вызова часто должны получать доступ к данным, заданным в функции главного приложения, или осуществлять обмен данными с другими коллбэками. Например, если вы создаете приложение с полем списка, вы можете хотеть, чтобы ваше приложение обновило изображение на основе опции поля списка, которую выбирает пользователь приложения. Поскольку каждая функция обратного вызова имеет свой собственный осциллограф, необходимо явным образом поделиться информацией об опциях поля списка и изображениях с теми частями приложения, которое должно получить доступ к нему. Чтобы выполнить это, используйте свою функцию главного приложения, чтобы хранить ту информацию способом, которой можно поделиться с коллбэками. Затем доступ или изменяет информацию из функций обратного вызова.

Храните данные о приложении

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

В дополнение к их предопределенным свойствам все компоненты имеют UserData свойство, которое можно использовать, чтобы сохранить любой MATLAB® данные. UserData содержит только одну переменную за один раз, но можно сохранить несколько значений как массив структур или массив ячеек. Можно использовать UserData сохранить указатели на компоненты пользовательского интерфейса в вашем приложении, а также другие данные о приложении, которые могут должны быть быть обновлены из вашего кода приложения. Один полезный подход должен хранить все ваши данные о приложении в UserData свойство окна рисунка главного приложения. Если у вас есть доступ к какому-либо компоненту в приложении, можно получить доступ к основному окну рисунка при помощи ancestor функция. Поэтому это сохраняет все ваши данные о приложении в месте, которое доступно из каждого коллбэка компонента.

Например, этот код создает фигуру с компонентом средства выбора даты. Это хранит и средство выбора даты и сегодняшнюю дату как массив структур в UserData свойство фигуры.

fig = uifigure;
d = uidatepicker(fig);
date = datetime("today");
fig.UserData = struct("Datepicker",d,"Today",date);

Примечание

Используйте UserData свойство хранить только данные, непосредственно связанные с вашим пользовательским интерфейсом приложения. Если ваше приложение использует большие наборы данных, или данные, которые не создаются или изменяются в вашем коде приложения, вместо этого хранят эти данные в отдельном файле и получают доступ к файлу из вашего приложения.

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

Доступ к данным о приложении из функций обратного вызова

К данным о приложении доступа в функции обратного вызова компонента используйте один из этих методов:

  • Доступ к данным в UserData — Использование этот метод, чтобы обновить данные о приложении из функции обратного вызова. Это требует, чтобы вы хранили данные о приложении в UserData свойство, как описано в предыдущем разделе.

  • Передайте Входные данные Коллбэкам — Использование этот метод в простых приложениях, чтобы ограничить, какие данные коллбэк имеет доступ к, и облегчить снова использовать код коллбэка.

  • Создайте Вложенные Функции обратного вызова — Использование этот метод в простых приложениях, чтобы предоставить вашим функциям обратного вызова доступ ко всем данным о приложении и организовать ваш код приложения в одном файле.

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

Word cloud app. The app has a text box with text, a button that says "Create Word Cloud", and a word cloud of the text in the text box.

Доступ к данным в UserData

Чтобы сохранить все ваши данные о приложении организованными в одном месте, храните данные где-нибудь, к которым может легко получить доступ каждый компонент. Во-первых, во фрагменте настройки вашего кода приложения, используйте UserData свойству окна рисунка хранить любые данные компонент нужен доступ к от его коллбэков. Поскольку каждый компонент пользовательского интерфейса является дочерним элементом основной фигуры, можно получить доступ к фигуре из коллбэка при помощи ancestor функция. Например, если ваша фигура содержит панель с кнопкой, которая хранится в переменной под названием btn, можно получить доступ к фигуре с этим кодом.

fig = ancestor(btn,"figure","toplevel");
Затем если у вас есть доступ к фигуре из коллбэка, можно получить доступ и изменить данные о приложении, хранимые в UserData из фигуры.

Пример: Word Cloud App Using UserData

В облачном приложении слова, чтобы совместно использовать данные о приложении, когда пользователь приложения нажимает кнопку, хранят данные в UserData свойство фигуры. Задайте ButtonPushedFcn функция обратного вызова под названием createWordCloud это строит слово, облачное на тексте в текстовой области. createWordCloud функционируйте доступ к потребностям к значению текстового поля в то время, когда кнопка нажата. Этому также нужен доступ к контейнеру панели, чтобы отобразить данные на графике в. Чтобы обеспечить этот доступ, установите UserData из фигуры к struct это хранит компонент текстовой области и контейнер панели.

fig.UserData = struct("TextArea",txt,"Panel",pnl);

В createWordCloud функция, получите доступ к UserData свойство фигуры. Поскольку MATLAB автоматически передает компонент, выполняющий коллбэк к функции обратного вызова как src, можно получить доступ к фигуре из коллбэка при помощи ancestor функция.

fig = ancestor(src,"figure","toplevel");

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

data = fig.UserData;
txt = data.TextArea;
pnl = data.Panel;
val = txt.Value;

Чтобы запустить этот пример, сохраните shareUserData функционируйте в файл с именем shareUserData.m на пути MATLAB.

function shareUserData
  % Create figure and grid layout
  fig = uifigure;
  gl = uigridlayout(fig,[2,2]);
  gl.RowHeight = {'1x',30};
  gl.ColumnWidth = {'1x','2x'};
  
  % Create and lay out text area
  txt = uitextarea(gl);
  txt.Layout.Row = 1;
  txt.Layout.Column = 1;
  
  % Create and lay out button
  btn = uibutton(gl);
  btn.Layout.Row = 2;
  btn.Layout.Column = 1;
  btn.Text = "Create Word Cloud";
  
  % Create and lay out panel
  pnl = uipanel(gl);
  pnl.Layout.Row = [1 2];
  pnl.Layout.Column = 2;
  
  % Store data in figure
  fig.UserData = struct("TextArea",txt,"Panel",pnl);
  
  % Assign button callback function
  btn.ButtonPushedFcn = @createWordCloud;
end

% Process and plot text
function createWordCloud(src,event)
  fig = ancestor(src,"figure","toplevel");
  data = fig.UserData;
  txt = data.TextArea;
  pnl = data.Panel;
  val = txt.Value;

  words = {};
  for k = 1:length(val)
      text = strsplit(val{k});
      words = [words text];
  end
  c = categorical(words);
  wordcloud(pnl,c);
end

Передайте входные данные коллбэкам

Когда для функции обратного вызова нужен доступ к данным, можно передать те данные непосредственно коллбэку как вход. В дополнение к src и event входные параметры, которые MATLAB автоматически передает каждой функции обратного вызова, можно объявить функцию обратного вызова с дополнительными входными параметрами. Передайте эти входные аргументы функции обратного вызова с помощью массива ячеек или анонимной функции.

Пример: Word Cloud App Using Callback Input Arguments

В облачном приложении слова, чтобы совместно использовать данные о приложении, когда пользователь приложения нажимает на кнопку, передают те данные ButtonPushedFcn функция обратного вызова.

Задайте ButtonPushedFcn функция обратного вызова под названием createWordCloud это строит слово, облачное на тексте в текстовой области. createWordCloud функционируйте доступ к потребностям к значению текстового поля в то время, когда кнопка нажата. Этому также нужен доступ к контейнеру панели, чтобы отобразить данные на графике в. Чтобы обеспечить этот доступ, задайте createWordCloud взять текстовую область и панель как входные параметры, в дополнение к необходимому src и event аргументы.

function createWordCloud(src,event,txt,pnl)
  % Code to plot the word cloud
end

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

btn.ButtonPushedFcn = {@createWordCloud,txt,pnl};

Чтобы запустить этот пример, сохраните shareAsInput функционируйте в файл с именем shareAsInput.m на пути MATLAB.

function shareAsInput
  % Create figure and grid layout
  fig = uifigure;
  gl = uigridlayout(fig,[2,2]);
  gl.RowHeight = {'1x',30};
  gl.ColumnWidth = {'1x','2x'};
  
  % Create and lay out text area
  txt = uitextarea(gl);
  txt.Layout.Row = 1;
  txt.Layout.Column = 1;
  
  % Create and lay out button
  btn = uibutton(gl);
  btn.Layout.Row = 2;
  btn.Layout.Column = 1;
  btn.Text = "Create Word Cloud";
  
  % Create and lay out panel
  pnl = uipanel(gl);
  pnl.Layout.Row = [1 2];
  pnl.Layout.Column = 2;
  
  % Assign button callback function
  btn.ButtonPushedFcn = {@createWordCloud,txt,pnl};
end

% Process and plot text
function createWordCloud(src,event,txt,pnl)
  val = txt.Value;
  words = {};
  for k = 1:length(val)
      text = strsplit(val{k});
      words = [words text];
  end
  c = categorical(words);
  wordcloud(pnl,c);
end

Создайте вложенные функции обратного вызова

Наконец, можно вложить функции обратного вызова в основной функции программного приложения. Когда вы делаете это, вложенные функции обратного вызова совместно используют рабочую область с основной функцией. В результате вложенные функции имеют доступ ко всем компонентам пользовательского интерфейса и переменным, заданным в основной функции.

Пример: Word Cloud App Using Nested Callback

В облачном приложении слова, чтобы совместно использовать данные о приложении, когда пользователь приложения нажимает на кнопку, вкладывают функцию обратного вызова кнопки в функции главного приложения. Задайте ButtonPushedFcn функция обратного вызова под названием createWordCloud это строит слово, облачное на тексте в текстовой области. createWordCloud функционируйте доступ к потребностям к значению текстового поля в то время, когда кнопка нажата. Этому также нужен доступ к контейнеру панели, чтобы отобразить данные на графике в. Чтобы обеспечить этот доступ, задайте createWordCloud в основном nestCallback функция. Вложенная функция имеет доступ к t и p переменные, которые хранят компоненты панели и текстовая область.

Чтобы запустить этот пример, сохраните nestCallback функционируйте в файл с именем nestCallback.m, и затем запустите его.

function nestCallback
  % Create figure and grid layout
  fig = uifigure;
  gl = uigridlayout(fig,[2,2]);
  gl.RowHeight = {'1x',30};
  gl.ColumnWidth = {'1x','2x'};
  
  % Create and lay out text area
  t = uitextarea(gl);
  t.Layout.Row = 1;
  t.Layout.Column = 1;
  
  % Create and lay out button
  b = uibutton(gl);
  b.Layout.Row = 2;
  b.Layout.Column = 1;
  b.Text = "Create Word Cloud";
  
  % Create and lay out panel
  p = uipanel(gl);
  p.Layout.Row = [1 2];
  p.Layout.Column = 2;
  
  % Assign button callback function
  b.ButtonPushedFcn = @createWordCloud;
  
  % Process and plot text
  function createWordCloud(src,event)
    val = t.Value;
    words = {};
    for k = 1:length(val)
        text = strsplit(val{k});
        words = [words text];
    end
    c = categorical(words);
    wordcloud(p,c);
  end
  
end

Похожие темы