objective c - OS X Delegate set label from other window (Xcode) -


i'm quite new mac programming (not objective c).

i'm developing small application, shows data , opens second window on button press. in second window textfield , submit button. if submit button pressed, window should close + value of textfield needs passed first window.

i think best method simple delegate. tried can't change label in first window using second window.. delegate seems work can call methods other class , send data it. won't change label.

as first try on delegates, im pretty sure i've done stupid here^^

or there better solution? can't complicated change label second window.. right?

viewcontroller.h (firstcontroller)

#import <cocoa/cocoa.h> @class viewcontroller;  @protocol viewcontrollerdelegate     -(void)sayhello:(viewcontroller *)viewcontroller; @end  @interface viewcontroller : nsviewcontroller {     iboutlet nstextfield *txtlabel; }     @property (nonatomic, assign) id  delegate;     -(void)hellodelegate;     -(void)recivevar:(nsstring*)strvar;  @end 

viewcontroller.m (firstcontroller)

#import "viewcontroller.h"  @implementation viewcontroller  @synthesize delegate;  -(id)init {      self = [super init];      return self;  }  - (void)viewdidload {     [super viewdidload];     txtlabel.stringvalue=@"test"; }   -(void)hellodelegate {     [delegate sayhello:self]; }  -(void)recivevar:(nsstring*)strvar {     nslog(@"recived: %@", strvar);     txtlabel.stringvalue=strvar; // dosent work!! }  @end 

secondcontroller.h

#import <cocoa/cocoa.h> #import "viewcontroller.h"  @interface secondcontroller : nsviewcontroller <viewcontrollerdelegate> {     iboutlet nstextfield *txtfield; }   -(ibaction)submit:(id)sender;  @end 

secondcontroller.m

#import "firstcontroller.h"  @implementation secondcontroller  -(void)viewdidload {     [super viewdidload];      viewcontroller *custom = [[viewcontroller alloc] init];     // assign delegate     custom.delegate = self;     [custom hellodelegate]; }  -(void)sayhello:(viewcontroller *)viewcontroller {     nslog(@"hiya!"); }  -(ibaction)submit:(id)sender {     nsstring *txtval= txtfield.stringvalue;     nslog(@"submit: %@", txtval);      viewcontroller *custom = [[viewcontroller alloc] init];     // assign delegate     custom.delegate = self;     [custom recivevar:txtval]; }    @end 

log output:

  1. hiya!
  2. submit: test
  3. recived: test

(so guess delegate works..)

solved. (thanks phillip mills)

nsnotification way simpler , efficient delegates in case.

viewcontroller.m

[...]  - (void)viewdidload {     [super viewdidload];     txtlabel.stringvalue=@"test";     [[nsnotificationcenter defaultcenter] addobserver:self                                              selector:@selector(handleupdateddata:)                                                  name:@"dataupdated"                                                object:nil]; } -(void)handleupdateddata:(nsnotification *)notification {     nslog(@"recieved %@", notification);     txtlabel.stringvalue=[notification object]; } 

secondcontroller.m

-(ibaction)submit:(id)sender {     nsstring *txtval= txtfield.stringvalue;     nslog(@"submit: %@", txtval);       [[nsnotificationcenter defaultcenter] postnotificationname:@"dataupdated"                                                         object:txtval]; } 

Comments

Popular posts from this blog

Magento/PHP - Get phones on all members in a customer group -

php - .htaccess mod_rewrite for dynamic url which has domain names -

Website Login Issue developed in magento -