Xcode 主应用程序窗口上控件的委托不正确

Xcode 主应用程序窗口上控件的委托不正确,xcode,delegates,interface-builder,Xcode,Delegates,Interface Builder,我正在用XCode 4.6开发一个应用程序 要从NSTextField控件I获取文本更改通知,请执行以下操作: 将NSTextField控件置于窗口上 通过在IB中单击鼠标右键,将控制委托连接到文件所有者,并从委托拖动到文件所有者 在窗口类中实现controlTextDidChange 对于应用程序,窗口类是我的AppDelegate,文件的所有者是NSApplication。对于模式对话框,NSWindowController的窗口类和文件的所有者的类型相同 如果我在AppDelegate

我正在用XCode 4.6开发一个应用程序

要从NSTextField控件I获取文本更改通知,请执行以下操作:

  • 将NSTextField控件置于窗口上
  • 通过在IB中单击鼠标右键,将控制委托连接到文件所有者,并从委托拖动到文件所有者
  • 在窗口类中实现controlTextDidChange
对于应用程序,窗口类是我的AppDelegate,文件的所有者是NSApplication。对于模式对话框,NSWindowController的窗口类和文件的所有者的类型相同

如果我在AppDelegate类的controlTextDidChange中设置断点,它将永远不会触发。如果我对模式对话框执行相同的过程,它就可以正常工作

我知道在主应用程序窗口中,控件的委托不是我的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  
//AppDelegate.h
//简单应用
#进口
#导入“SimpleTest/SimpleTest.h”
@接口AppDelegate:NSObject
@属性(分配)窗口*窗口;
@属性(分配)IBNStextField*textField;
@结束
//AppDelegate.m
//简单应用
#导入“AppDelegate.h”
@实现AppDelegate
-(无效)ApplicationIDFinishLaunching:(NSNotification*)通知
{  
//现在在这里没什么可做的。
}  
//此函数中设置的断点从不激发。
-(无效)controlTextDidChange:(NSNotification*)obj
{  
NSMutableString*description=[[NSMutableString alloc]init];
id aDelegate=[[u textField delegate];
类delegateClass=[aDelegate类];
[description setString:[delegateClass description]];
[说明发布];
}  
//提供有关学员的一些信息。
-(iAction)文本更改:(id)发件人
{  
NSTextField*theTextField=(NSTextField*)发送方;
NSMutableString*description=[[NSMutableString alloc]init];
id aDelegate=[theTextField delegate];
类delegateClass=[aDelegate类];
[description setString:[delegateClass description]];
[说明发布];
}  
@结束
以下是主窗口上NSTextField的右键单击信息的快照-

Identity inspector将文件的所有者显示为NSApplication,这是我在调试程序中看到的,当我在textChange中设置断点并在文本字段中单击return时。然而,controlTextDidChange的实现者self是AppDelegate。相反,在模式对话框中,self和文件的所有者是同一个对象,派生自NSWindowController


因此,结果是我没有在主窗口中为控件分配正确的委托-我该怎么做?

你能发布一些代码吗

使用委托时,请确保指定类实现所需的协议

@接口MyClass:NSObject

还要确保您正在创建一个属性来存储代理

@property(强,非原子)id委托

关于这一点:

请注意,尽管NSControl定义了委托方法,但它没有 它本身有一个委托。使用这些方法的任何子类都必须具有 委托及其获取和设置方法。此外,正式的 委托协议NSCONTROLTEXTEDITING委托协议还定义 控件委托使用的委托方法。

其中包括:controlTextDidBeginEditing:、controlTextDidChange:、controlTextDidEndEditing:


哦,哇-在我的问题中添加更多细节,我想我找到了答案。只需拖动到代表应用程序委派的蓝色立方体,而不是从文本字段委派拖动到文件所有者

添加了代码,也许找到了让它工作的方法。它确实有效,但这是正确的方法吗?这会导致任何有害的副作用吗?Doh-我的最后一行可以改写为“如何使App Delegate成为NSTextField的委托”。答案是只连接它们,而不是文件的所有者!