Ok, Long time ML coder, first time ML OO coder. After about 3 hours of messing around with Matlab's OO syntax, I've discovered that any callback function being assigned as an event listener must be declared as a static method? Where in the doc's does it talk about this? Why? Here's the Matlab help example classes:
The Event Creator:
classdef ToggleButton < handle properties State = false end events ToggledState end methods ... function OnStateChange(obj,newState) % Call this method to check for state change if newState ~= obj.State obj.State = newState; notify(obj,'ToggledState'); % Broadcast notice of event end end end end
And the Event Consumer:
classdef RespondToToggle < handle methods function obj = RespondToToggle(toggle_button_obj)
addlistener(toggle_button_obj,'ToggledState',@RespondToToggle.handleEvnt); end end methods (Static) function handleEvnt(src,evtdata) disp(nargin) if src.State disp('ToggledState is true') % Respond to true ToggleState here else disp('ToggledState is false') % Respond to false ToggleState here end end end end
Then, by typing the following on the command line:
Great. No problem. BUT...if you change the callback's method attribute in RespondToToggle so that it's not static: ...
methods function handleEvnt(src,evtdata) disp(nargin) if src.State disp('ToggledState is true') % Respond to true ToggleState here else disp('ToggledState is false') % Respond to false ToggleState here end end end ...
tb.OnStateChange(true) Warning: Error occurred while executing callback: Undefined function or method 'RespondToToggle.handleEvnt' for input arguments of type 'ToggleButton'.
What doc did I miss where this is described? Why do I need to do this? Also, don't believe that 'clear' will reset you workspace by believing this warning: What's with these nebulous warnings? The doc seems to go over the same trivial description of use about 15 different ways but doesn't describe what you need to know to make this stuff work.
Warning: The class file for 'RespondToToggle' has been changed; but the change cannot be applied because objects based on the old class file still exist. If you use those objects, you might get unexpected results. You can use the 'clear' command to remove those objects. See 'help clear' for information on how to remove those objects.
You need to type 'clear all' for the workspace to recognize your changes.