我正在使用XCode 4.6开发一个应用程序。
要从NSTextField控件I:
获取文本更改通知对于应用程序,窗口类是我的AppDelegate,文件的所有者是NSApplication。对于模态对话框,NSWindowController和File的所有者的窗口类属于同一类型。
如果我在controlTextDidChange中放置一个断点,在AppDelegate类中,它永远不会触发。如果我使用模态对话框执行相同的过程,它可以正常工作。
我知道在主应用程序窗口的情况下,控件的委托不是我的AppDelegate。
在主窗口中连接控制委托时我做错了什么?我一定很遗憾。文件所有者是否为控件设置了正确的委托?
任何帮助都将不胜感激。
以下是一些要求的代码。
// AppDelegate.h
// SimpleApplication
#import <Cocoa/Cocoa.h>
#import "SimpleTest/SimpleTest.h"
@interface AppDelegate : NSObject <NSApplicationDelegate>
@property (assign) IBOutlet NSWindow *window;
@property (assign) IBOutlet NSTextField *textField;
@end
// AppDelegate.m
// SimpleApplication
#import "AppDelegate.h"
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
// Not much to do here for now.
}
// Breakpoint set in this function never fires.
- (void)controlTextDidChange:(NSNotification *)obj
{
NSMutableString* description= [[NSMutableString alloc] init];
id aDelegate= [_textField delegate];
Class delegateClass= [aDelegate class];
[description setString:[delegateClass description]];
[description release];
}
// To provide some information about the delegates.
- (IBAction)textChange:(id)sender
{
NSTextField* theTextField= (NSTextField*)sender;
NSMutableString* description= [[NSMutableString alloc] init];
id aDelegate= [theTextField delegate];
Class delegateClass= [aDelegate class];
[description setString:[delegateClass description]];
[description release];
}
@end
以下是主窗口上NSTextField的右键单击信息 -
身份检查器将文件的所有者显示为 NSApplication ,这是我在调试器中看到的,当我在textChange中放置断点并在文本字段中单击return时。但是, self 是controlTextDidChange的实现者,是 AppDelegate 。相比之下,在模态对话框中, self 和 File的所有者是从 NSWindowController 派生的相同对象。
所以,结果是我没有在主窗口中为控件分配正确的委托 - 我该怎么做?
答案 0 :(得分:0)
你可以发布一些代码吗?
使用委托时,请确保指定类实现所需的协议。
@interface MyClass : NSObject <SomeProtocol>
还要确保创建一个属性来存储委托。
@property (strong, nonatomic) id<SomeProtocol> delegate;
RE this:
请注意,虽然NSControl定义了委托方法,但它没有 本身有一个代表。任何使用这些方法的子类都必须具有 委托以及获取和设置它的方法。另外,正式 委托协议NSControlTextEditingDelegate协议也定义了 委托控制代理使用的方法。 ...
这些包括:controlTextDidBeginEditing:,controlTextDidChange:和controlTextDidEndEditing:
答案 1 :(得分:0)
哦,哇 - 在我的问题中添加更多细节,我想我找到了答案。而不是从文本字段委托拖动到文件的所有者,只需拖动到代表App Delegate的蓝色立方体!