2012-04-20 52 views
0

我有一個Card對象,它有4個實例變量,分別是name(NSString),pin(NSString),points( NSNumber),pointsToDeduct(NSMutableArray)。如何訪問作爲對象實例的屬性的可變數組,並將該數組填充到值中

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 
+1

您應該只發布與您的問題相關的代碼。通過發佈你所有的代碼,你會限制你得到的答案的數量,因爲沒有多少人會花時間去完成所有這些。 – 2012-04-21 05:22:07

+0

注意,謝謝! :) – Grauzten 2012-04-22 11:25:45

回答

0

你PerksDetailViewController需要有當前的卡對象的屬性第二類。然後,它只是的

[self.card.pointsToDeduct addObject:pointsRequired]; 

一個身在何處,你實際上是使用任何的卡對象,我不能在所有的示例代碼中看到。

+0

噢,我在創建卡的新實例時使用它。等待我編輯我的帖子。 – Grauzten 2012-04-20 09:27:36

+0

完成編輯。 – Grauzten 2012-04-20 09:36:30

+0

我的答案保持不變 - 您需要將卡作爲屬性傳遞到控制器,然後像上面那樣訪問陣列。 – jrturton 2012-04-20 13:02:38

0

在當前類 NSMutable Array from One Class to Another Class in iPhone

#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; 
相關問題