Iphone Text Array, Ошибка при передаче строки в метод.Не можете объяснить, должен быть терминатор массива? - PullRequest
0 голосов
/ 19 сентября 2011

Я получаю ошибки NSCFString, передавая результаты текстовой строки, преобразованной в массив, в метод, который ожидает строки.

У меня такое ощущение, что проблема в том, что что-то не так с преобразованием массива, но я не достаточно умен, чтобы решить это !!!

вот файл .h

@interface RootViewController : UIViewController <ZXingDelegate> {
IBOutlet UITextView *resultsView;
NSString *resultsToDisplay;

IBOutlet UITextField *ItemNo;
NSString *ItemNoToDisplay;

IBOutlet UITextField *VariantCode;
NSString *VariantCodeToDisplay;

IBOutlet UITextField *Description;
NSString *DescriptionToDisplay;

IBOutlet UITextField *Qty;
NSString *QtyToDisplay;

}

@property (nonatomic, retain) IBOutlet UITextView *resultsView;
@property (nonatomic, copy) NSString *resultsToDisplay;

@property (nonatomic, retain) IBOutlet UITextField *ItemNo;
@property (nonatomic,copy) NSString *ItemNoToDisplay;

@property (nonatomic, retain) IBOutlet UITextField *VariantCode;
@property (nonatomic,copy) NSString *VariantCodeToDisplay;

@property (nonatomic, retain) IBOutlet UITextField *Description;
@property (nonatomic,copy) NSString *DescriptionToDisplay;

@property (nonatomic, retain) IBOutlet UITextField *Qty;
@property (nonatomic,copy) NSString *QtyToDisplay;

в .m файле, который я делаю, код основан на тестовом приложении сканирования сканирования штрих-кода Zxing.

Штрих-код, который я сканирую, содержит строку, разделенную;

- (void)zxingController:(ZXingWidgetController*)controller didScanResult:(NSString *)result {
self.resultsToDisplay = result;
if (self.isViewLoaded) 
{
    //This is where the result comes back from the scanner.
    //Need to use this to add items to a basket etc
    //This is where we can create a new basket screen...

    //NSString *myString = @"This is a test";
    NSArray *myArray = [result componentsSeparatedByString:@";"];

    ItemNoToDisplay = [myArray objectAtIndex:0];
    [ItemNo setText:ItemNoToDisplay];
    [ItemNo setNeedsDisplay];

    VariantCodeToDisplay = [myArray objectAtIndex:1];
    [VariantCode setText:VariantCodeToDisplay];
    [VariantCode setNeedsDisplay];


    DescriptionToDisplay = [myArray objectAtIndex:2];
    [Description setText:DescriptionToDisplay];
    [Description setNeedsDisplay];

    [resultsView setText:resultsToDisplay];
    [resultsView setNeedsDisplay];

    }
   [self dismissModalViewControllerAnimated:NO];
}

Затем у меня есть кнопка на экране, которую пользователь использует для передачи данных простым способом.

-(int)AddItemToBasket:(NSString *)ItemNo:(int)QtyToAdd:(NSString *)ItemDescription:(double)SalesPrice:(NSString *)DisplayPrice;

приложение запускается, пользователь сканирует код, окно заполняется правильно, есть несколько полей для хранения разделенных данных.

когда пользователь нажимает кнопку для вызова метода.

если я использую то, что ожидаю от работы

 Utility *sharedUtility = [Utility sharedUtility];

 [sharedUtility AddItemToBasket:(ItemNoToDisplay):(1):(DescriptionToDisplay):(0):(@"1")];

но это делает

 Utility *sharedUtility = [Utility sharedUtility];

 [sharedUtility AddItemToBasket:(ItemNoToDisplay):(1):(Description.text):(0):(@"1")];

При первом вызове всегда возникают ошибки с неправильным доступом или нет ошибки типа NSCFstring.

Кажется, что в LAST-части массива есть какой-то забавный символ, который обрабатывает текстовое поле, а код - нет. Некоторая проблема завершения.

Я обошел эту проблему, используя переменную из текстового поля, но не понимаю, почему я могу напрямую передать значение в текстовое поле, которое я передаю в текстовое поле?

Помощь / Confused ..

Ответы [ 2 ]

1 голос
/ 19 сентября 2011

Вы проходите все усилия по определению свойств, но затем никогда не используете их.Это означает, что вы не сохраняете значения, и ОС освобождает их перед тем, как вы фактически их используете.

Итак, здесь:

DescriptionToDisplay = [myArray objectAtIndex:2]; 

Вам необходимо:

self.DescriptionToDisplay = [myArray objectAtIndex:2]; 
1 голос
/ 19 сентября 2011

Вы напрямую присваиваете своим струнным иварам вместо того, чтобы проходить через синтезированные средства доступа (например, должно быть self.DescriptionToDisplay = ....

Это означает, что вы назначаете автоматически освобожденный объект для ивара, который может не быть вокругкогда вы вызываете свой метод AddItemToBasket.

Кроме того, принято начинать имена методов и имена ivar строчными буквами, а также именовать аргументы в ваших методах, так как метод AddItemToBasket очень трудно читать.

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

...