Hi Josh,
Hi Nikolaus,

On 2026-02-27 22:07:06 +0100 Josh Freeman <[email protected]> wrote:

Hi Patrick,

The SaveLink instance is being set up as an observer for NSControlTextDidChangeNotifications from within -[SaveLink observe:], but that method isn't called anywhere, except as the textfields' IBAction:

- Notifications won't be observed until one of the textfields sends its action (user presses <Enter> while the textfield's active)

- The SaveLink instance will be re-registered for the notifications each time the textfields send the action

I suggest moving the -[NSNotificationCenter addObserver:...] calls to -awakeFromNib; That gets called only once, automatically, after loading the .gorm file:

<<-
- (IBAction) observe:(id)sender
{
// Register for notifications
   [[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(textDidChange:) name:NSControlTextDidChangeNotification
                                                object:name];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange:) name:NSControlTextDidChangeNotification
                                                object:link];
}

->>
- (IBAction) observe:(id)sender
{
}

- (void) awakeFromNib
{
   // Register for notifications
   [[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(textDidChange:) name:NSControlTextDidChangeNotification
                                                object:name];

   [[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(textDidChange:) name:NSControlTextDidChangeNotification
                                                object:link];
}

I changed then moved '- (void) awakeFromNib' method from 'AppController' to 'SaveLink' following the above code change.


    Also, in -[SaveLink textDidChange:]:

- Calling [[urlLink substringToIndex: 4] isEqualToString: @"http"] will throw an exception if urlLink's length is less than 4, so suggest replacing it with [urlLink hasPrefix: @"http"]

I added this to my Devel memo: great to know.


- Nesting the urlLink check within the nameLink check can leave the savebutton enabled in cases where the nameLink has non-zero length but the urlLink has no http prefix, so suggest un-nesting the checks:

<<-
- (void)textDidChange:(NSNotification *)notification
{
...
   if([nameLink length])
   {
     if([[urlLink substringToIndex: 4] isEqualToString: @"http"])
     {
       NSLog(@"Button save enabled");
       [savebutton setEnabled:YES];
     }
   }
   else
   {
     [savebutton setEnabled:NO];
   }
}

->>
- (void)textDidChange:(NSNotification *)notification
{
...
   if([nameLink length] && [urlLink hasPrefix: @"http"])
   {
     NSLog(@"Button save enabled");
     [savebutton setEnabled:YES];
   }
   else
   {
     [savebutton setEnabled:NO];
   }
}


Thank you to point this.
Finally, I used the quick and elegant statement suggested by Nikolaus.

    Lastly, in SaveLink_main.m's main() function:

int
main(int argc, const char *argv[])
{
   [NSApp setDelegate: [SaveLink new]];
   return NSApplicationMain (argc, argv);
}

I suggest removing the call to [NSApp setDelegate: [SaveLink new]]:

- NSApp isn't valid until NSApplication is initialized, within NSApplicationMain()

- A SaveLink object will be instantiated when loading the .gorm file (and its IBOutlets & IBActions will be connected correctly), so calling [SaveLink new] will just allocate (& leak) a different SaveLink instance, one without its outlets & actions connected

I better understand all these interactions now.


    Hope this is helpful!

Cheers,

Josh

(...)

Of course, it was. Thank you both, Josh and Nikolaus, for the master class.

Now, SaveLink is working as expected and it will be published in the next release of AGNoStep.

Cheers,
Patrick

--
Patrick Cardona - Pi500 - GNU/Linux aarch64 (Debian 13.3)
Xorg (1:7.7+24) - libcairo2 (1.18.4-1+rpt1 arm64) - Window Maker (0.96.0-4) GWorkspace (1.1.0 - 02 2025) - Theme: AGNOSTEP - Classic - MUA: GNUMail (1.4.0 - rev.947)


Reply via email to