2017-01-16 40 views
1

這是許多其他人遇到的類似問題,其中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個)。

回答

0

一般來說,如果你想擁有你從一個回調調用來修改handles然後還要提供給調用函數的變化的函數,你不僅需要保存handles結構的叫函數(以便它們可用於其他回調),但是必須在調用函數中重新加載handles結構,否則調用函數只是簡單地使用它自己的本地(並且未修改)的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(您希望它被更改),以確保您擁有最新的版本。

+0

這基本上意味着我必須修改addlistener行以包含某種'handles = guidata(hObject)'調用。有沒有辦法在addlistener函數輸入中嵌套多個函數調用?比如'@(s,e)updatefilesave(hObject,[],句柄);句柄= guidata(hObject)' – toshiomagic

+0

@toshiomagic不會。如我在回答的最後部分所說的,你不能從' addlistener',並且由於它是異步執行的,所以在分配偵聽器之後將'handles = guidata(hObject)'放在代碼中*不起作用。你需要在你的代碼中放置'handles = guidata(hObject)',然後才能訪問'handles'並且期望它不同。 – Suever

+0

好了。這基本上打敗了聽衆的目的。如果我不得不去每個函數的's'變化,並說'句柄= guidata(hObject)'我不妨去每個地方說'handles.fileUnsaved = true'。 – toshiomagic

相關問題