0

カードオブジェクトがあります。これには、name(NSString)、pin(NSString)、points(NSNumber)、pointsToDeduct(NSMutableArray)の4つのインスタンス変数があります。

Card.h

@interface Card : NSObject

    @property (nonatomic, strong) NSString *name;
    @property (nonatomic, strong) NSString *pin;
    @property (nonatomic, strong) NSNumber *points;
    @property (nonatomic, strong) NSMutableArray *pointsToDeduct;

@end

このpointsToDeduct配列は、私が作成するカードのすべての新しいインスタンスに常に存在します。私が欲しいのは、ボタンをクリックするだけで静的な別の配列の値でその値を埋めることです。ただし、その前に、以下のコードで、これらの静的な値をNSNumberにキャストして、pointsToDeductの値がNSNumber型になるようにします。私はこれを行うための代表団を考えていますが、それが最善かどうかはわかりません。今のところ、そのpointsToDeduct配列にアクセスして、値を追加できるようにします。

*これはPerksDetailsViewController.mの一部です

- (IBAction)redeemPressed:(id)sender {

     NSNumber *pointsRequired;
     NSNumberFormatter * formatter = [[NSNumberFormatter alloc] init];
     [formatter setNumberStyle:NSNumberFormatterDecimalStyle];

     pointsRequired = [formatter numberFromString: (self.pointsLabel.text)];

     NSLog(@"points required by the perk %@", pointsRequired);

    // now insert pointsRequired's value to pointsToDeduct array instance variable of a Card

以下は私が持っている他のコードです。

メインビューCardWalletViewController.h

#import <UIKit/UIKit.h>

@interface CardWalletViewController : UITableViewController 

@property (nonatomic, strong) NSMutableArray *myWallet;

-(void) printArrayContents;

CardWalletViewController.m

#import "CardWalletViewController.h"
#import "AddCardViewController.h"
#import "Card.h"
#import "CardDetailsViewController.h"

@interface CardWalletViewController () <AddCardDelegate>

@end

@implementation CardWalletViewController


@synthesize myWallet = _myWallet;

- (NSMutableArray *) myWallet
{
    if (_myWallet == nil) _myWallet = [[NSMutableArray alloc] init]; 
    return _myWallet;
}


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"showAddCardVC"]) {
        AddCardViewController *addCardVC = (AddCardViewController *)segue.destinationViewController;

        addCardVC.delegate = self;

    }
}

- (void)printArrayContents 
{

    // I want to show the name of each instance

    for ( int i = 0; i < self.myWallet.count; i++) {
        Card *cardDummy = [self.myWallet objectAtIndex:i];
        NSLog(@"Element %i is %@", i,cardDummy.name );
    }
}

- (void)addCardViewController:(AddCardViewController *)sender didCreateCard:(Card *)newCard
{
    // insert a new card to the array

    [self.myWallet addObject:newCard];

    [self printArrayContents];
    [self.tableView reloadData];
}

- (void)saveMyWallet: (NSMutableArray *)myWallet
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    [defaults setObject:self.myWallet forKey:@"myWalletArray"];

    [defaults synchronize];
    NSLog(@"I am saved");
}


- (NSMutableArray *)loadWallet 
 {
    NSMutableArray *boom;
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    boom = [defaults objectForKey: @"myWalletArray"];

    if (!boom) {
        boom = [[NSMutableArray alloc] init];
    }



 return boom;

}

- (void)viewDidLoad
{
    [self loadWallet];
    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.
}

- (void)viewDidUnload
{
    [super viewDidUnload];

    // Release any retained subviews of the main view.
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    //this method will return the number of rows to be shown
    return self.myWallet.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = (UITableViewCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];

    }


    Card *cardDummy = [self.myWallet objectAtIndex:indexPath.row];
    cell.textLabel.text = cardDummy.name;
    cell.detailTextLabel.text = [NSString stringWithFormat:@"%@", cardDummy.points]; 

    return cell;
}

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    //this method is responsible for showing the details of a selected card
    //make another view controller - DetailVC perhaps

    CardDetailsViewController *details = [self.storyboard instantiateViewControllerWithIdentifier:@"cardDetails"];


    Card *cardDummy = [self.myWallet objectAtIndex:indexPath.row];

    details.myPoints = [NSString stringWithFormat:@"%@", cardDummy.points];

    [self.navigationController pushViewController:details animated:YES];
}



- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 60;
}


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

@end

新しいカードを作成する方法

AddCardViewController.m

#import "AddCardViewController.h"
#import "Card.h"
#import "CardWalletViewController.h"

@interface AddCardViewController ()

@end

@implementation AddCardViewController 

@synthesize cardNameTextField = _cardNameTextField;
@synthesize pinTextField = _pinTextField;
@synthesize pointsTextField = _pointsTextField;

@synthesize delegate = _delegate;


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self.cardNameTextField becomeFirstResponder];


}    

- (BOOL) textFieldShouldReturn:(UITextField *)textField{

    if ([textField.text length]) {
    [self.cardNameTextField resignFirstResponder];

    [self.pinTextField resignFirstResponder];

    [self.pointsTextField resignFirstResponder];

    return YES;
    }

    else {
        return NO;
    }
}

- (void)viewDidLoad
{
    self.cardNameTextField.delegate = self;
    self.pinTextField.delegate = self;
    self.pointsTextField.delegate = self;
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)viewDidUnload
{
    [self setCardNameTextField:nil];
    [self setPinTextField:nil];
    [self setPointsTextField:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (IBAction)addCard:(id)sender 
{
    Card *myNewCard = [[Card alloc] init];


    myNewCard.name = self.cardNameTextField.text;

    myNewCard.pin = self.pinTextField.text;


    NSNumber *myPoints;
    NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
    [f setNumberStyle:NSNumberFormatterDecimalStyle];

    myPoints = [f numberFromString: (self.pointsTextField.text)];

    myNewCard.points = myPoints;


    //method here that will dismiss the modal view
    // if condition forces the user to fill up all the text field

    if ([self.cardNameTextField.text length] && [self.pinTextField.text length] && [self.pointsTextField.text length]) 
    {
        //method here that will dismiss the modal view
        [[self presentingViewController] dismissModalViewControllerAnimated:YES];


        //checking...
        NSLog(@"name saved %@", myNewCard.name);
        NSLog(@"pin saved %@", myNewCard.pin);
        NSLog(@"points saved %@", myNewCard.points);

        [self.delegate addCardViewController:self didCreateCard:myNewCard];

        // to check if there is a delegate
        /*
         if (self.delegate){
            NSLog(@"delegate is not nil");
        }
         */
    }
}

@end

AddCardViewController.h

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

@class AddCardViewController;

@protocol AddCardDelegate <NSObject>

- (void)addCardViewController:(AddCardViewController *)sender
                didCreateCard:(Card *) newCard;

@end


@interface AddCardViewController : UIViewController <UITextFieldDelegate>


@property (strong, nonatomic) IBOutlet UITextField *cardNameTextField;
@property (strong, nonatomic) IBOutlet UITextField *pinTextField;
@property (strong, nonatomic) IBOutlet UITextField *pointsTextField;

@property (nonatomic, strong) id <AddCardDelegate> delegate;

@end

CardDetailsViewController.m

#import "CardDetailsViewController.h"
#import "PerksDetailsViewController.h"
#import "Card.h"

@interface CardDetailsViewController ()

@end

@implementation CardDetailsViewController

@synthesize pointsLabel = _pointsLabel;
@synthesize myPoints  = _myPoints;

@synthesize perks = _perks;
@synthesize datasource = _datasource;
@synthesize datasourcePoints = _datasourcePoints;

-(void)setupArray
{
    self.perks = [[NSMutableDictionary alloc] init];
    [self.perks setObject:@"200" forKey:@"10% Discount"];
    [self.perks setObject:@"100" forKey:@"250Php Off"];

    self.datasource = [self.perks allKeys]; //contains perk's description
    self.datasourcePoints = [self.perks allValues]; //contains perk's required points
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{
    return 2;
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = (UITableViewCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }

    cell.textLabel.text = [self.datasource objectAtIndex:indexPath.row];
    cell.detailTextLabel.text = [self.datasourcePoints objectAtIndex:indexPath.row];

    return cell;
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    PerksDetailsViewController *perksDetails = [self.storyboard instantiateViewControllerWithIdentifier:@"detailsOfMyPerks"];
    [self.navigationController pushViewController:perksDetails animated:YES];

    perksDetails.perkDetailsLabel.text = [self.datasource objectAtIndex:indexPath.row];
    perksDetails.pointsLabel.text = [self.perks objectForKey:perksDetails.perkDetailsLabel.text];
}


- (void)viewDidLoad
{

    //show the number of points of the selected Card

    self.pointsLabel.text = self.myPoints;
    self.navigationItem.title = @"Your Points";

    [self setupArray];
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)viewDidUnload
{
    [self setPointsLabel:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

@end

CardDetailsViewController.h

#import <UIKit/UIKit.h>

@interface CardDetailsViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> 
{

}

@property (nonatomic, retain) NSMutableDictionary *perks;
@property (nonatomic, retain) NSArray *datasource;
@property (nonatomic, retain) NSArray *datasourcePoints;

-(void)setupArray;

@property (strong, nonatomic) IBOutlet UILabel *pointsLabel;
@property (nonatomic, weak) NSString *myPoints;

@end

PerksDetailsViewController.m

#import "PerksDetailsViewController.h"
#import "Card.h"
#import "CardWalletViewController.h"

@interface PerksDetailsViewController ()

@end

@implementation PerksDetailsViewController

@synthesize pointsLabel = _pointsLabel;
@synthesize perkDetailsLabel = _perkDetailsLabel;
@synthesize perkDetailText = _perkDetailText;
@synthesize pointsText = _pointsText;

- (IBAction)redeemPressed:(id)sender {
    // get required points of a perk selected
    // cast the NSString value to an int/NSInteger

     NSNumber *pointsRequired;
     NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
     [f setNumberStyle:NSNumberFormatterDecimalStyle];

     pointsRequired = [f numberFromString: (self.pointsLabel.text)];

    NSLog(@"points required by the perk %@", pointsRequired);

    // now insert this value to points array instance variable of a Card        

}



- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    //self.perkDetailsLabel.text = self.perkDetailText;
    //self.pointsLabel.text = self.pointsText;
    NSLog(@"perk detail:%@", self.perkDetailText);
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)viewDidUnload
{
    [self setPerkDetailsLabel:nil];
    [self setPointsLabel:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

@end

PerksDetailsViewController.h

#import <UIKit/UIKit.h>

@interface PerksDetailsViewController : UIViewController
{
    NSString *perkDetailText;
    NSString *pointsText;
    IBOutlet UILabel *perkDetailsLabel;
    IBOutlet UILabel *pointsLabel;
}

@property (nonatomic, retain) IBOutlet UILabel *perkDetailsLabel, *pointsLabel;

@property (nonatomic, retain) NSString *perkDetailText, *pointsText;

@end
4

2 に答える 2

0

現在のクラス では、iPhoneのあるクラスから別のクラスへのNSMutable配列

#import "SecondViewController"
 SecondViewController *NextViewController = [[SecondViewController alloc]initWithNibName:@"SecondViewController" bundle:nil];

        NextViewController.nextClasssArray = thisClassarray;

セカンドクラスで.h

@property(nonatomic,retain) NSMutableArray *nextClasssArray;
in second class .m

@synthesize nextClasssArray;
于 2012-04-20T09:13:03.473 に答える
0

PerksDetailViewControllerには、現在のCardオブジェクトのプロパティが必要です。次に、それは単に問題です

[self.card.pointsToDeduct addObject:pointsRequired];

すべてのサンプルコードで、実際にCardオブジェクトを使用している場所を確認できません。

于 2012-04-20T09:24:00.430 に答える