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
日志输出:
- 嗨!
- 提交:测试
- 收到:测试
(所以我猜委托有效..)
已解决。 (感谢 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];
}
我是 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
日志输出:
- 嗨!
- 提交:测试
- 收到:测试
(所以我猜委托有效..)
已解决。 (感谢 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];
}