Iphone Text Array,将字符串传递给方法时出错。无法解释,必须是数组终止符?

时间:2011-09-19 12:06:05

标签: iphone arrays nsstring uitextfield

我收到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类型错误。

似乎数组的最后一部分有一些文本字段处理的有趣字符,但代码没有。某种终止问题。

我通过使用文本框中的变量解决了这个问题,但是为什么我可以直接传递我传递给文本框的文本字段中的值而感到困惑?

帮助/困惑..

2 个答案:

答案 0 :(得分:1)

您直接指定字符串ivars而不是通过合成访问者(例如应该是self.DescriptionToDisplay = ...

这意味着您要将一个自动释放的对象分配给ivar,在您调用AddItemToBasket方法时可能不会出现这种情况。

顺便说一下,通常用小写字母开始方法名称和ivar名称,并且在方法中命名参数,AddItemToBasket方法很难阅读。

在回答您的意见时,如果自自动释放以来未重新分配内存区域,则有时可能会有效。但是你肯定需要使用访问器,特别是setter - 这将复制并增加你的保留计数。在这种情况下,您可以直接使用ivar作为吸气剂。

答案 1 :(得分:1)

您经历了定义属性的所有工作,但从未使用它们。这意味着您没有保留这些值,操作系统会在您实际使用它们之前取消分配它们。

所以这里:

DescriptionToDisplay = [myArray objectAtIndex:2]; 

你需要:

self.DescriptionToDisplay = [myArray objectAtIndex:2];