在Objective-C中作为外部类委派

时间:2009-01-20 16:34:51

标签: iphone objective-c xcode delegates external

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

我的界面中有一个UITextField。当用户点击键盘时它会显示键盘,但我需要手动编程如何隐藏键盘。可以使用代表完成。所以在IB中,我从库中获取Object,将其类名称作为Control1Delegate,然后将我的textfield中的委托出口连接为此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连接到此控制器(文件的所有者)时,一切都按预期工作。我看到大多数苹果代码教程将委托方法放入随机对象而不是单独的类 - 我想知道原因。我不能在单独的班级中担任代表吗?

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

3 个答案:

答案 0 :(得分:1)

您的Control1Delegate对象在创建后很快就会被销毁。如果要保持活动状态,则必须保留所有顶级Nib对象。请参阅Resource Programming Guide: The Nib Object Life Cycle

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

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

谢谢你们俩。我现在不仅知道如何解决我的问题,而且最终了解了如何在Nib创建过程中保留对象。在IB中创建对象是不够的,如果它是一个新实体,它必须连接到文件所有者中的真实ivar(具有适当合成的getter / setter)。