-1

我在我的应用程序中制作购物车之类的概念时遇到了麻烦。我的 AppDelegate(名为 ST2AppDelegate)包含一个名为 myCart 的 NSMutableArray。我希望 RecipeViewController.m 将 NSString 对象传递给 myCart,但每次我将 NSString 传递给它并使用 NSLog 显示数组的内容时,它总是为空的。

谁能告诉我我做错了什么?我已经在这段代码上工作了好几天,有一行代码我根本不明白发生了什么(在 RecipeViewController.m 中,标记为这样)。

任何帮助将不胜感激......我只是一个初学者。以下是相关类:

ST2AppDelegate.h:

#import <UIKit/UIKit.h>

@interface ST2AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) NSMutableArray* myCart;

- (void)addToCart:(NSString*)item;
- (void)readCartContents;

@end

ST2AppDelegate.m:

#import "ST2AppDelegate.h"

@implementation ST2AppDelegate

@synthesize myCart;

// all the 'applicationDid...' methods...

- (void)addToCart:(NSString *)item
{
    [self.myCart addObject:item];
}

- (void)readCartContents
{
    NSLog(@"Contents of cart: ");
    int count = [myCart count];
    for (int i = 0; i < count; i++)
    {
        NSLog(@"%@", myCart[count]);
    }
}

@end

RecipeDetailViewController.h:

#import <UIKit/UIKit.h>
#import "ST2AppDelegate.h"

@interface RecipeDetailViewController : UIViewController 

@property (nonatomic, strong) IBOutlet UILabel* recipeLabel;
@property (nonatomic, strong) NSString* recipeName;
@property (nonatomic, strong) IBOutlet UIButton* orderNowButton;

- (IBAction)orderNowButtonPress:(id)sender;

@end

RecipeDetailViewController.m:

#import "RecipeDetailViewController.h"

@implementation RecipeDetailViewController

@synthesize recipeName;
@synthesize orderNowButton;

// irrelevant methods...

- (IBAction)orderNowButtonPress:(id)sender
{
    // alter selected state
    [orderNowButton setSelected:YES];
    NSString* addedToCartString = [NSString stringWithFormat:@"%@ added to cart!",recipeName];
    [orderNowButton setTitle:addedToCartString forState:UIControlStateSelected];

    // show an alert
    NSString* addedToCartAlertMessage = [NSString stringWithFormat:@"%@ has been added to your cart.", recipeName];
    UIAlertView* addedToCartAlert = [[UIAlertView alloc] initWithTitle:@"Cart Updated" message:addedToCartAlertMessage  delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
    [addedToCartAlert show];

    // add to cart (I don't understand this, but it works)
    [((ST2AppDelegate*)[UIApplication sharedApplication].delegate) addToCart:recipeName];

    // read cart contents
    [((ST2AppDelegate*)[UIApplication sharedApplication].delegate) readCartContents];
}

@end
4

2 回答 2

2

您需要在应用程序启动时初始化 myCart:

self.myCart = [[NSMutableArray alloc] init];

否则,您只是试图将对象添加到 nil 对象,虽然由于 Objective-c 处理 nil 对象的方式它不会引发异常,但在初始化它之前它不会按预期运行。

于 2013-07-09T16:40:56.427 回答
1

你有没有初始化过购物车变量?

尝试做惰性实例化。

-(NSMutableArray *) myCart{
     if (!_myCart){
          _myCart = [[NSMutableArray alloc] init];
     }
   return _myCart;

}

这样你就会知道它总是会被分配。基本上,这种方法使得每当有人调用您的对象的类版本时,它都会检查该对象是否已分配,如果没有则分配它。这是您应该对大多数对象使用的常见范例。

这个方法应该放在应用程序委托中(声明对象的地方)。

于 2013-07-09T16:44:12.807 回答