3

我正在使用 Xcode 和 Interface Builder 为 iPhone 创建一个简单的项目。虽然我了解什么是委托,但我在使用它时遇到了问题。

我的界面中有一个 UITextField 。当用户点击它时它会显示键盘,但我需要手动编程如何隐藏键盘。可以使用委托来完成。所以在 IB 中,我从库中获取对象,将它的类名指定为 Control1Delegate,然后将我的文本字段中的委托出口连接到这个 Control1Delegate。我也有这个 Control1Delegate 类的 .m 和 .h 文件:

Control1Delegate.h

@interface Control1Delegate : NSObject <UITextFieldDelegate> {
}

- (BOOL) textFieldShouldReturn:(UITextField *)textField;

@end

Control1Delegate.m

#import "Control1Delegate.h"

@implementation Control1Delegate

- (BOOL) textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return YES;
}

@end

但这不起作用。运行时,它永远不会到达 textFieldShouldReturn 方法,或者在没有 msg 或 EXEC_BAD_ACCESS 的情况下崩溃。有趣的是,当我将方法移动到控制器文件(已生成一个向导)并从 UITextField 连接到此控制器(文件所有者)时,一切都按预期工作。我看到大多数苹果代码教程将委托方法放入随机对象而不是单独的类中 - 我想知道为什么。我不能在单独的班级中有代表吗?

我在这里缺少什么?一些空指针?对象生命周期?

4

3 回答 3

1

您的 Control1Delegate 对象在创建后不久就会被销毁。如果要让它们保持活动状态,则必须保留所有顶级 Nib 对象。请参阅资源编程指南:Nib 对象生命周期

文件的所有者可以有这样的属性,以保留对象:

@property (nonatomic, retain) IBOutlet Control1Delegate *control1delegate;

记住在不再需要对象后释放它。

于 2009-01-20T17:41:14.017 回答
0

您可以将委托方法放在任何类中,包括专为此目的而构建的方法。Apple(和其他程序员)通常不专门为委托函数创建类的原因是它变得过于复杂且难以共享数据。例如,在我的一个项目中,我可能会创建一个 Window Controller 子类来处理来自窗口的委托方法、窗口内的表视图和窗口的工具栏。操作和维护该窗口状态所需的一切都在一个控制器类中。现在想象三个独立的类(可能加上一个管理它们的控制器类)执行相同的功能——这是很多额外的工作,没有真正的好处。

至于它为什么崩溃,听起来你在应用程序的其他地方犯了内存管理错误。您可以使用调试器准确跟踪它的来源。

于 2009-01-20T17:16:16.937 回答
0

谢谢你俩。我现在不仅知道如何解决我的问题,而且终于明白了对象在 Nib 创建过程中是如何保留的。在 IB 中创建对象是不够的,如果它是一个新实体,它必须连接到 File's Owner 中的真实 ivar(使用正确合成的 getter/setter)。

于 2009-01-20T19:27:24.613 回答