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