OS X代表从其他窗口设置标签(Xcode)

时间:2015-06-04 11:41:02

标签: objective-c xcode macos delegates

我对Mac编程很新(不是对象C)。

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

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

由于这是我对代表的第一次尝试,我很确定我在这里做了些蠢事^^

还是有更好的解决方案?从第二个窗口更改标签是不是很复杂..对吧?

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

日志输出:

  1. 你好!
  2. 提交:测试
  3. recived:test
  4. (所以我猜代表工作..)

1 个答案:

答案 0 :(得分:0)

解决。 (感谢Phillip Mills

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

<强> ViewController.m

Print2LPT.Print();

<强> secondController.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];
}