OS X 委托设置来自其他 window (Xcode) 的标签

OS X Delegate set label from other window (Xcode)

我是 Mac 编程的新手(不是 Objective C)。

我正在开发一个小应用程序,它显示一些数据并在按下按钮时打开第二个 window。 在第二个 window 中是一个文本字段和一个提交按钮。如果按下提交按钮,window 应该关闭 + 文本字段的值需要传递给第一个 window.

我认为最好的方法是一个简单的委托。我试过了,但我无法使用第二个 window 更改第一个 window 中的标签。 然而,委托似乎可以工作,因为我可以从另一个 class 调用方法并向它发送数据。它只是不会改变标签。

因为这是我第一次尝试 Delegates,所以我很确定我在这里做了一些愚蠢的事情^^

或者有更好的解决办法吗?从第二个 window.. 更改标签不会太复杂吧?

ViewController.h(第一个控制器)

#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(第一个控制器)

#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

日志输出:

  1. 嗨!
  2. 提交:测试
  3. 收到:测试

(所以我猜委托有效..)

已解决。 (感谢 Phillip Mills

在这种情况下,NSNotification 比 Delegates 更简单高效。

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];
}