这是guidata(hOjbect, handles)
似乎没有更新值的许多其他人遇到的类似问题。我和听众一起使用它,我不知道该如何继续。
在我的gui_OpeningFcn
我有以下一行:
addlistener(handles.s, 'name', 'PostSet', @(s,e)updatefilesave(hObject, [], handles));
这会适当地设置侦听器,并在修改名称时调用updatefilesave
。但是,updatefilesave
内部是以下代码:
handles.fileUnsaved = true;
guidata(hObject, handles);
在函数内部,两条线都有效。当我在第一行和步骤上断点时,fileUnsaved
被设置为true。在我执行第二行(仍然在updatefilesave
函数内)后,handles.fileUnsaved
仍然设置为true。
然而,当我退出该功能时,绿色箭头会被放到addlistener
功能的gui_OpeningFcn
行。在此级别,handles.fileUnsaved
现在设置为false。
如何在使用侦听器时获取更新句柄?
修改
我尝试做的是知道输入字段何时发生变化,以便在关闭程序之前提示用户保存他们的工作。我检查了CloseRequestFcn中的fileUnsaved标志,如果是真的,我会询问用户是否要在退出前保存。
function namebox_Callback(hObject, eventdata, handles)
newName = handles.namebox.String;
if ~isempty(newName)
handles.s.name = newName; % (listener gets triggered here post set)
end
handles.namebox.String = handles.s.name;
guidata(hObject, handles); % (namebox's local handles with fileUnsaved set to false gets put into hObject)
这就是我无法在handles = guidata(hObject)
中致电CloseRequestFcn
的原因。阻止此操作的唯一方法是在调用handles = guidata(hObject)
之前在名称框回调中调用guidata(hObject, handles)
。但到处都这样做会破坏使用听众的意义。我会在每个回调函数(大约50个)中将fileUnsaved设置为true。
答案 0 :(得分:1)
我偶然发现这个线程有一个类似的问题,但是对我来说,修改监听器中的句柄似乎是可行的。
在外部函数中,我有这样的东西:
handles.myListener = addlistener(ObjectThrowingEvent,'EventName', @(src,evt)ListenerFunction(src, evnt, hObject));
guidata(hObject,handles);
然后在内部函数中
function ListenerFunction(ObjectThrowingEvent, eventData, hObject)
handles = guidata(hObject)
% a bunch of stuff happens, including updates to the handles structure
guidata(hObject, handles);
在我看来,区别在于我要传入hObject并在侦听器中从hObject查找句柄。即使侦听器是异步的,它也正在传递给hObject,我认为它只是指向图形的当前状态,而不是某些本地未更新的副本。
如果这对您有用,我会很好奇。到目前为止,它似乎在我的代码中仍然有效。
答案 1 :(得分:0)
一般情况下,如果您希望从一个回调中调用一个函数来修改handles
,然后让这些更改可用于调用函数,那么您不仅需要保存调用函数中的handles
结构(以便它们可用于其他回调),但是你必须在调用函数中重新加载handles
结构,否则调用函数只是简单地使用它& #39;自己的handles
本地(并且未经修改)副本,因为它无法知道它已被修改。
function main_callback(hObject, eventData, handles)
% Set the value to one thing
handles.value = false;
sub_callback(hObject, eventData, handles);
% Check that the value is STILL false
disp(handles.value)
% Load in the change so that handles gets updated
handles = guidata(hObject);
end
function sub_callback(hObject, eventData, handles)
handles.value = true;
% Save the value
guidata(hObject, handles);
end
另一个选择是让你的其他功能返回修改后的handles
function handles = sub_callback(hObject, eventData, handles)
handles.value = true;
guidata(hObject, value);
end
然后在调用函数中,您可以使用输出参数覆盖本地handles
变量
handles = sub_callback(hObject, eventData, handles);
现在讨论关于addlistener
的具体问题,因为回调是在"异步"中执行的。感觉,返回一个值并没有多大意义。我建议的是重新加载handles
数据(如第一个示例所示),然后再次使用handles
(您希望更改它)以确保您拥有最新版本。