Objective-c Iphone как установить значение по умолчанию для свойства

Привет, у меня есть следующий код в 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

Проблема заключается в том, что я хочу добавить строку для ввода, но это невозможно, если ее значение равно null. Вот почему я хочу установить значение по умолчанию для ввода "@". Но где я могу поместить этот код.

Я знаю одно возможное решение, в котором вы помещаете его в конструктор по умолчанию. Но я не знаю, в какой файл это поставить. И где я должен это назвать.

К сожалению, я получил ограниченное понимание C и понял, что, возможно, файл .h не подходит.

Тип проекта - это приложение на основе вида, если вам это нужно.

Надеюсь, что вы сможете помочь.

Ответы

Ответ 1

Вам может быть полезно прочитать некоторую документацию на Objective-C или Cocoa. Вероятно, вы найдете полезные рекомендации по чтению материалов, если вы выполняете поиск в StackOverflow или в Google.

Чтобы ответить на ваш вопрос, вы должны иметь @implementation CalcViewController. Один из них чаще всего помещал бы эту @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 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 проще справиться.
  • Вам не нужно объявлять @property для переменной экземпляра дисплея при подключении с помощью Interface Builder. Если вы не хотите, чтобы клиенты CalcViewController часто меняли его.

РЕДАКТИРОВАТЬ: 28 апреля 2009 года: 10:20 утра EST: Я предлагаю на самом деле выделить NSString, поскольку вы должны технически освободить его в dealloc.

EDIT: 28 апреля 2009: 11:11 AM EST: я обновил @implementation, чтобы использовать версию init для UIViewController.

Ответ 2

Очень хороший вопрос. Короткий ответ - инициализировать значения в функции init. Вам необходимо перезаписать функцию init по умолчанию, чтобы значение по умолчанию было готово до того, как объект будет использоваться. Я хотел бы предложить людям прекратить предлагать другим прочитать документ; пожалуйста, ответьте на вопрос напрямую, если сможете.

Ответ 3

Другой вариант - написать собственный getter для вашего свойства ввода и вернуть @"", если переменная экземпляра равна nil. Это будет работать, даже если вы случайно или намеренно назначили nil для ввода, тогда как использование init для установки значения по умолчанию будет нарушено.

Ответ 4

Самый очевидный способ реализовать это будет выглядеть следующим образом:

  • В файле viewcontroller.m переопределите метод init по умолчанию. Этот метод вызывается каждый раз, когда инициализируется контроллер представления. Таким образом, это лучший способ инициализировать вашу переменную.

    - (id)initWithNibName:(NSString*)aNibName bundle:(NSBundle*)aBundle {
        self = [super initWithNibName:aNibName bundle:aBundle]; // The UIViewController     version of init
        if (self) {
            varName = [[NSString alloc] initWithString:@""];
        }
        return self;
    }
    
  • Теперь, в любом коде вашего кода вы хотите добавить строку к своему оригинальная строка, просто используйте: varName = [NSString stringwithformat:@"%@%@", varName, newString];