【问题标题】:Delegate as external class in Objective-C在 Objective-C 中作为外部类委托
【发布时间】:2010-10-02 12:02:04
【问题描述】:

我正在使用 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 连接到此控制器(文件所有者)时,一切都按预期工作。我看到大多数苹果代码教程将委托方法放入随机对象而不是单独的类中 - 我想知道为什么。我不能在单独的班级中有代表吗?

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

【问题讨论】:

    标签: iphone objective-c xcode delegates external


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 非常感谢!我知道我正在击中一个 nil 对象,但我不知道如何保留它。尽管可能很明显,但这个答案中缺少的是您必须在 IB 中连接您刚刚创建的委托插座与您在那里的委托对象。
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢。虽然我可以理解您的观点并想象它在哪里有用,但我通常反对包含所有内容的大型控制器类。我不喜欢将控制器方法与委托方法混合的方式,将它们与以下内容分开: /* 委托方法从这一点开始 */
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 2010-09-10
      • 1970-01-01
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      • 1970-01-01
      相关资源
      最近更新 更多