這是許多其他人遇到的類似問題,其中guidata(hOjbect, handles)
似乎沒有更新值。我正在和一個聽衆一起使用它,並且不知道如何繼續。Matlab guidata(hObject,句柄)在從監聽器調用時不更新UI中的標誌
在我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。
但是,當我退出該功能時,綠色箭頭會被放到gui_OpeningFcn
函數中的addlistener
行。在此級別,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)
這就是爲什麼我不能在CloseRequestFcn
調用handles = guidata(hObject)
。唯一的方法是在撥打guidata(hObject, handles)
之前,在名稱框回撥中撥打handles = guidata(hObject)
。但是在任何地方這樣做都會挫敗使用聽衆的觀點。我會在每個回調函數中將fileUnsaved設置爲true(其中大約50個)。
這基本上意味着我必須修改addlistener行以包含某種'handles = guidata(hObject)'調用。有沒有辦法在addlistener函數輸入中嵌套多個函數調用?比如'@(s,e)updatefilesave(hObject,[],句柄);句柄= guidata(hObject)' – toshiomagic
@toshiomagic不會。如我在回答的最後部分所說的,你不能從' addlistener',並且由於它是異步執行的,所以在分配偵聽器之後將'handles = guidata(hObject)'放在代碼中*不起作用。你需要在你的代碼中放置'handles = guidata(hObject)',然後才能訪問'handles'並且期望它不同。 – Suever
好了。這基本上打敗了聽衆的目的。如果我不得不去每個函數的's'變化,並說'句柄= guidata(hObject)'我不妨去每個地方說'handles.fileUnsaved = true'。 – toshiomagic