我对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
日志输出:
(所以我猜代表工作..)
答案 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];
}