【问题标题】:Set default values for a global variable in a custom class?为自定义类中的全局变量设置默认值?
【发布时间】:2009-02-22 21:04:36
【问题描述】:

我有一个自定义类,它有很多用于自定义它的访问器方法。我的问题是,如果程序员使用这个类并且因为他不知道或不想打扰所有这些方法而不愿意为所有这些方法分配值,我怎样才能让这个类假设一个默认视图?我不能使用 awakeFromNib,因为这会覆盖 AppController awakeFromNib 中的有目的的自定义。

有什么简单的方法吗?

编辑:

NSView 中的类和自定义方法只是修改一个实例变量然后告诉视图重绘(背景颜色等)。当我没有明确告诉某个对象为所有这些自定义项分配值时,它会将它们设置为零。我需要将其更改为他们假定可用默认值的位置。

【问题讨论】:

  • 你能提供更多细节吗?属性如何改变与此控制器关联的视图?
  • 另外,这个类应该是子类,还是按原样使用?

标签: objective-c cocoa xcode macos


【解决方案1】:

我对你想要做什么感到困惑。如果您想为类成员设置默认值,只需在您的 init 方法中分配给他们:

- (id) init
{
    if((self = [super init]))
    {
        member1 = member1default;
        member2 = member2default;  // etc.
    }
    return self;
}

- (id) initWithCoder:(NSCoder *)encoder  // this is called for objects constructed from a NIB
{
    if((self = [super initWithCoder:encoder]))
    {
        member1 = member1default;
        member2 = member2default;  // etc.
    }
    return self;
}

【讨论】:

  • 这是一个 NSView,所以我会覆盖 initWithFrame 吗?我试过这个,实现一个像这样的初始化: - (id)initWithFrame:(NSRect)frameRect { } 然后基本上做你在上面做的事情,为实例变量赋值。应用程序在启动时崩溃,提示“正在加载大量堆栈帧,x%。”
  • 视图被放置在一个 NIB 文件中,仅供参考。
【解决方案2】:

(对不起,我是 StackOverflow 菜鸟;我似乎还不能评论其他人的答案。)

是的,您通常会在自定义 NSView 子类中覆盖 initWithFrame。确保你也在调用超类的 initWithFrame: 方法:

self = [super initWithFrame:frameRect];

关于加载大量堆栈帧的错误消息让我认为您可能无意中创建了无限递归循环。但是,如果没有看到代码,我无法确定。

【讨论】:

    猜你喜欢
    • 2017-07-31
    • 2012-09-06
    • 2013-12-13
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 2023-01-27
    相关资源
    最近更新 更多