简体   繁体   中英

Gaining access to an NSMutableArray

I am new to arrays and objects. I have a class HowToPlay.h (of course that has am also) their i define two arrays

NSMutableArray *nibs;
NSMutableArray *unusedNibs;
@property (nonatomic, retain) NSMutableArray *nibs;
@property (nonatomic, retain) NSMutableArray *unusedNibs;

then we jump into the.m, i write all the stuff for the arrays,

nibs = [[NSMutableArray alloc]initWithObjects:@"Question 2", @"Question 3", nil];
self.unusedNibs = nibs;
[nibs release];

Then i also have another class called Question 1, i need to be able to use this array in that class, and be able to change it, but keep the changes on the HowToPlay.m file.

here is why, basically this array loads random NIB files, and then deletes them from the array when they have been used.

in Question 1.m here is what im doing to use the array

random = arc4random() % [self.unusedNibs count];
NSString *nibName = [self.unusedNibs objectAtIndex:random];
[self.unusedNibs removeObjectAtIndex:random];

if (nibName == @"Question 3") {
    Question_3 *Q3 = [[Question_3 alloc] initWithNibName:@"Question 3" bundle:nil];

    Q3.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self presentModalViewController:Q3 animated:YES];
    [Q3 release];
}

if (nibName == @"Question 2") {
    Question_2 *Q2 = [[Question_2 alloc] initWithNibName:@"Question 2" bundle:nil];

    Q2.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self presentModalViewController:Q2 animated:YES];
    [Q2 release];
}

This all seems to work fine, but the problem im having is it seems that objects in the array are not getting deleted, even though this line runs

[self.unusedNibs removeObjectAtIndex:random];

I haved tried making it

[HowToPlay.unusedNibs removeObjectAtIndex:random];

I get a error saying expected '.' before '.' token expected '.' before '.' token

It seems to me that i have access to read the array, but not to change it. any way to fix this so i can change the array? thanks

UPDATE:

here is the whole HowToPlay.h file contents:

#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>

int score;
int usedQ1;
int usedQ2;
int usedQ3;
NSMutableArray *nibs;
NSMutableArray *unusedNibs;

@interface HowToPlay : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource> {


UIPickerView *selectType;
NSMutableArray *selectArray;

AVAudioPlayer *audioPlayer;

UIActivityIndicatorView *progress;
UIButton *worldButton;
UIButton *politicsButton;
UIButton *starButton;

}
@property (nonatomic, retain) NSMutableArray *nibs;
@property (nonatomic, retain) NSMutableArray *unusedNibs;

@property (nonatomic, retain) IBOutlet UIButton *worldButton;
@property (nonatomic, retain) IBOutlet UIButton *politicsButton;
@property (nonatomic, retain) IBOutlet UIButton *starButton;

@property (nonatomic, retain) IBOutlet UIPickerView *selectType;
@property (nonatomic) int usedQ1;
@property (nonatomic) int usedQ2;
@property (nonatomic) int usedQ3;

@property (readwrite) int score;






-(IBAction)World:(id)sender;
- (IBAction)Politics:(id)sender;
-(IBAction)Stars:(id)sender;




@end

#import "MainViewController.h"
#import "Question 1.h"
#import "Question 2.h"
#import "Question 3.h"

I import after because otherwise i get errors

Also I have the array set up on theViewDidLoad part of HowToPlay, is this a bad idea?

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor blackColor]; 

    NSURL *click = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/click.wav",         [[NSBundle mainBundle] resourcePath]]];
    audioPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:click error:nil];
    audioPlayer.numberOfLoops = 1;




    progress = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    progress.frame = CGRectMake(0.0, 0.0, 30.0, 30.0);
    progress.center = self.view.center;
    [self.view addSubview: progress];

    usedQ1 = 0;
    usedQ2 = 0;
    usedQ3 = 0;


    selectArray = [[NSMutableArray alloc]init];
    [selectArray addObject:@"World"];
    [selectArray addObject:@"Politics"];
    [selectArray addObject:@"Stars"];
    score = 0;

    nibs = [[NSMutableArray alloc]initWithObjects:@"Question 2", @"Question 3", nil];
    self.unusedNibs = nibs;
    [nibs release];
}

How do you check if objects are actually deleted? Please post some more code as the way you remove objects from unusedNibs seems to be fine. As per this code:

[self.unusedNibs removeObjectAtIndex:random];

and this code

[HowToPlay.unusedNibs removeObjectAtIndex:random];

The reason why you're getting this error is because you're trying to access unusedNibs using a class name "HowToPlay" instead of its instance "self".

A couple of things: first, to call properties like unusedNibs in HowToPlay it looks like you are calling the class and not an instance. You need to create a HowToPlay object and assign it to a property in your Question1 object so the question one Object has something to call to. Question1 should not call 'self' for unusedNibs since it does not own it.

With what you are doing it might make more sense to put the function figuring out the next random controller in the HowToPlay class. That way your question view controllers could just ask it to return which controller is next without having to duplicate that code across every question controller.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM