1

请帮我解决一个简单的问题。我是objective-c的初学者,我刚刚从java切换到objective-c。我很了解java,但不是很深入。

我正在构建一个 iphone 应用程序。我的应用程序非常简单。我的 iphone 应用程序的目的是在餐厅用我的 iphone 应用程序点菜。

我的应用程序的进度: 我的应用程序现在只有几个视图面板和按钮 :) 是我的应用程序源代码,firstview screenshot & secondview screenshot

问题: 当我点击 Coffee 按钮时,我的 textField 不会显示咖啡名称和咖啡价格,假设显示为“coffee 1”。并且 xcode 会从 iphone 模拟器将我带到调试器。(我认为它在一行中迷恋,所以调试器将我带到 IBaction 方法并在@synthesize 名称行中断;它编译没有错误。请帮助排除故障原因当我按下咖啡按钮时,xcode 将我带到调试器。

按下咖啡按钮后屏幕立即显示

这是咖啡按钮的动作代码

- (IBAction)Coffee:(id)sender {
    int price = 1;
    NSString *name = @"coffee";

    Storage *order = [[Storage alloc] init];
    [order setName:name];               // i assume the program crush at here when it look into setName method.
    [order setPrice:price];
    [orders addOrders:order];

    // Sanity check:     // the program not even hit this line yet before crush;
    NSLog(@"There are now %d orders in the array.", [orders.getOrders count]);

    for (Storage *obj in orders.getOrders){
        [check setText:[NSString stringWithFormat:@"%@",[obj description]]];  // check is the TextField instant varible. and the description method is from storage.m to print out the name and price.
    }
}

下面的代码是我的存储类,用于存储我的客户订购的所有物品。它是一个二维数组,My Storages类是Storage类的包装类。数组格式如下所示:

arrayindex1-> 名称,价格

arrayindex2-> 名称,价格

arrayindex3-> 名称,价格

arrayindex4-> 名称,价格

存储.h

#import <Foundation/Foundation.h>

@interface Storage : NSObject

@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger price;

@end

存储.m

#import "Storage.h"

@implementation Storage

@synthesize name;         // program crush and goes to here.
@synthesize price;

- (NSString *)description {
    // example: "coffee 1"
    return [NSString stringWithFormat:@"%@ %d", self.name, self.price];
}

@end

存储.h

#import <Foundation/Foundation.h>
#import "Storage.h"
@interface Storages : NSObject

@property (nonatomic,strong, readwrite) NSMutableArray *orders;

-(void) addOrders:(Storage *)anOrder;
-(NSMutableArray *) getOrders;

@end

存储.m

#import "Storages.h"

@implementation Storages
@synthesize orders;

- (id)init {
    self = [super init];
    if (self) {
        orders = [[NSMutableArray alloc] init];
    }
    return self;
}

-(void) addOrders:(Storage *)anOrder{
    [orders addObject: anOrder];
}
-(NSMutableArray *) getOrders{
    return orders;
}
@end
4

4 回答 4

1

这里有几个问题。

1) 不要对 price 属性使用指针。通常,除非您正在做一些不寻常的事情,否则作为对象的属性将是指针,而作为基元(NSInteger、BOOL、float 等)的属性将不是指针。

2)您需要确保订单NSMutableArray是用对象初始化的Storages,否则订单将保持为零,并且无论何时您尝试向其添加对象,都不会发生任何事情。要初始化NSMutableArray,请在您的init方法中执行此操作,如下所示。for (Storage *obj in orders.getOrders) { ... }您还可以通过在循环中放置一个简单的 NSLog 语句并确保您在循环中至少获得一次迭代来检查对象是否实际上进入了一个有效的可变数组。如果 orders.getOrders 为 nil,for 循环的工作块将永远不会运行。

3)听起来您需要覆盖(并且可能已经覆盖)-[NSObject description]存储对象的方法。我的猜测是您在此方法中与-[NSString stringWithFormat:...]格式字符串不匹配。例如,您可能在NSInteger *. 这样的事情肯定会导致崩溃(这就是我认为您所说的“Xcode 将您带到调试器”的意思)。对于 NSInteger,您需要使用 %d 或 %i。正如我和其他人所提到的,你想要NSInteger这里而不是NSInteger *你应该改变你的财产声明。

4)根据你在这里的情况,我认为你根本不需要课堂上的order财产。Storages

5) 确保您没有忽略将 Interface Builder 中的 IBOutlet 连接到checktextField 的可能性。一个很好的测试,除了确认它在 Interface Builder 中连接之外,将是一个现实检查测试,如[check setText:@"This is a test."];

6) 请记住,一旦这工作正常,您的 for 循环将很快执行,您将立即看到orders 数组中最后一个对象的描述。但这似乎不是你的问题。

我建议您进行以下更改:

存储.h

#import <Foundation/Foundation.h>

@interface Storage : NSObject

@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger price;

@end

存储.m

#import "Storage.h"

@implementation Storage

@synthesize name;
@synthesize price;

- (NSString *)description {
    // example: "coffee 1"
    return [NSString stringWithFormat:@"%@ %d", self.name, self.price];
}

@end

您的 IBAction 方法

- (IBAction)Coffee:(id)sender {
    int price = 1;
    NSString *name = @"coffee";

    Storage *order = [[Storage alloc] init];
    [order setName:name];
    [order setPrice:price];
    [orders addOrders:order];

    // Sanity check:
    NSLog(@"There are now %d orders in the array.", [orders.getOrders count]);

    for (Storage *obj in orders.getOrders){
        [check setText:[NSString stringWithFormat:@"%@",[obj description]]];  // check is the TextField instant varible. and the description method is from storage.m to print out the name and price.
    }
}

存储.h

#import <Foundation/Foundation.h>
#import "Storage.h"
@interface Storages : NSObject

@property (nonatomic,strong, readwrite) NSMutableArray *orders;

-(void) addOrders:(Storage *)anOrder;
-(NSMutableArray *) getOrders;

@end

存储.m

#import "Storages.h"

@implementation Storages
@synthesize orders;

- (id)init {
    self = [super init];
    if (self) {
        orders = [[NSMutableArray alloc] init];
    }
    return self;
}

-(void) addOrders:(Storage *)anOrder{
    [orders addObject: anOrder];
}
-(NSMutableArray *) getOrders{
    return orders;
}
@end
于 2013-01-30T06:23:58.867 回答
0

您有两个错误:
1-您将价格声明为 NSInteger 并将其作为参考传递。正确的做法是按原样将其作为整数传递,并在整个应用程序中将其作为整数处理。
2-您没有在 Storages 类中初始化订单数组,因此它将始终为 nil 并且不会保存任何添加的对象。

您的代码可能如下所示:

在按钮的 IBAction 中直接传递价格

[order setPrice:price];

在存储类中

- (NSString *)description {
    return [NSString stringWithFormat: @"%@        %d", name, price];
}

将以下内容添加到 Storages 类

-(id)init
{
    if (self = [super init])
    {
        orders = [[NSMutableArray alloc] init];
    }
    return self;
}
于 2013-01-30T07:16:29.680 回答
0

您在课堂上使用了不正确的NSInteger指针。是基本数据类型而不是指针。删除该指针并使用变量。我希望这能解决你的问题。StoragesNSIntegerNSInteger

您可以使用以下代码:

@interface Storage : NSObject

@property (nonatomic, retain)NSString *name;

@property (nonatomic, assign)NSInteger price;
于 2013-01-30T05:33:57.607 回答
0

下面的描述是做什么的?(我在 Storage 类中看不到任何描述对象):

[check setText:[NSString stringWithFormat:@"%@",[obj description]]];

我认为如果您想打印名称,请执行以下操作:

[check setText:[NSString stringWithFormat:@"%@: %@",obj.name, obj.price]];
于 2013-01-30T05:14:52.743 回答