Objective-C iPhone如何为属性设置默认值

14

嗨,我在 ViewController.h 文件中有以下代码:

#import <UIKit/UIKit.h>

@interface CalcViewController : UIViewController {
    NSNumber* result;
    NSString* input;
    //NSString* input = @"";

    IBOutlet UITextField* display;
}

@property (retain) NSNumber* result;
@property (retain) NSString* input;
@property (nonatomic, retain) UITextField* display;

@end
问题在于我想将一个字符串附加到输入,但当输入仍为空时这是不可能的。这就是为什么我想把输入的默认值设置为 @""。但我应该把这段代码放在哪里呢?
我知道一个可能的解决方案是将其放在默认构造函数中。但我不知道应该把它放在哪个文件中,以及从哪里调用它。
很遗憾,我只有有限的C语言理解能力,并意识到 .h 文件可能不是正确的位置。
如果需要,项目类型是基于视图的应用程序。
希望你能帮忙。
4个回答

16

您可能会发现阅读一些关于Objective-C或Cocoa的文档很有用。如果在StackOverflow或Google上进行搜索,您可能会找到一些不错的阅读材料建议。

回答您的问题,您应该拥有CalcViewController的@implementation。大多数情况下,@implementation会放在*.m文件中。如果您的*.h文件名为“ViewController.h”,则实现将放在“ViewController.m”中。

然后,您将创建一个UIViewController的初始化函数的副本并将其放置在其中(我不知道默认的init函数是什么)。

例如:

@implementation CalcViewController

@synthesize result;
@synthesize input;

- (id)initWithNibName:(NSString*)aNibName bundle:(NSBundle*)aBundle
{
    self = [super initWithNibName:aNibName bundle:aBundle]; // The UIViewController's version of init
    if (self) {
        input = [[NSString alloc] initWithString:@""]; // You should create a new string as you'll want to release this in your dealloc
    }
    return self;
}

- (void)dealloc
{
    [input release];
    [super dealloc];
}
@end // end of the @implementation of CalcViewController

注意:

  • 你可能想将文件重命名为CalcViewController。我认为这样更容易让Xcode的重构引擎处理。
  • 由于你已经在Interface Builder中连接了显示实例变量,所以不需要为该变量声明@property。除非你希望CalcViewController的客户端经常更改它

编辑: 2009年4月28日:东部时间上午10:20:我建议实际分配一个NSString,因为你应该在dealloc中释放它。

编辑: 2009年4月28日:东部时间上午11:11:我更新了@implementation,使用了UIViewController的版本init。


好的,我会想办法在没有变量的情况下更改显示。但是-(id)init没有被调用。有什么原因吗? - MrHus
实际调用是 "- initWithNibName:bundle:",您的代码应该直接创建 CalcViewController 如下:CalcViewController* vc = [[CalcViewController alloc] initWithNibName:@"MyCalcView" bundle:nil];或者通过在 Interface Builder 直接连接它。正如我在文本中试图暗示的那样,我认为 "init" 不是正确的初始化程序。再次阅读文档以基本了解 Cocoa 的工作原理。祝好运! - Lyndsey Ferguson
1
因为“阅读文档”评论而将此投票否决。有时候你只是想知道自己是否做对了。例如,我已经阅读了一段时间的文档,在谷歌上搜索以确认我的理解后找到了这个答案。不要成为一个混蛋。 - Dmitry Minkovsky
2
本意并非冒犯,而是要指出应该审查一些基础概念,否则将会出现其他问题,使代码作者感到困扰。你怎么改变我的回答,以便我仍然可以建议审查文档而不会显得粗鲁呢?谢谢。我确实回答了这个问题。 - Lyndsey Ferguson
3
这些都是很好的建议,但“阅读文档”是最重要的部分。正如俗话所说:“授人以鱼不如授人以渔”。这个问题直接涉及Objective-C(和大多数面向对象编程语言)的基本知识--如果提问者不了解初始化程序的作用,那么他/她肯定需要回顾基础知识。@dimadima当您想要确保自己正确地操作某件事时,您首先应该去查看您正在使用的任何语言或框架的文档。 - Caleb
显示剩余3条评论

9
非常好的问题。简短的答案是在init函数中初始化值。您需要覆盖默认的init函数,以便在对象可以使用之前准备好默认值。 我建议人们停止建议其他人阅读文档;如果您能直接回答问题,请直接回答问题。

5
说“啦啦啦,也许你应该看文档”的人应该受到惩罚、排斥和仇恨。他们很蠢。 - Alex Gray
因为我非常认同这种观点,所以我在 Stack Overflow 上给 Alex Gay 点赞。 - Dmitry Minkovsky

3
另一种选择是为您的输入属性编写自己的getter,如果实例变量为空,则返回@""。即使您意外或故意将输入分配为nil,这也可以工作,而使用init设置默认值会出现问题。

一个很好的解决方案,但不是常规做法。其他阅读你代码的人可能会将指定的初始化程序视为默认值。 - Barry Wark
1
我不会这样说,在 Cocoa 中返回空对象而不是 nil 是非常普遍的。这并不是说在 init 中设置它是不好的或者什么的,更多的是个人喜好问题。 - Marc Charbonneau

0

最明显的实现方式是像下面这样:

  1. 在你的viewcontroller.m文件中,重写默认的init方法。 每次初始化视图控制器时都会调用此方法。 因此,这是初始化变量的最佳方式。

    - (id)initWithNibName:(NSString*)aNibName bundle:(NSBundle*)aBundle {
        self = [super initWithNibName:aNibName bundle:aBundle]; // UIViewController的init版本
        if (self) {
            varName = [[NSString alloc] initWithString:@""];
        }
        return self;
    }
    
  2. 现在,在您的代码中,无论何时想要将字符串附加到原始字符串中,只需使用:varName = [NSString stringWithFormat:@"%@%@", varName, newString];


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接