获得对NSMutableArray的访问权限

时间:2011-07-11 23:11:14

标签: objective-c arrays ios nib

我是数组和对象的新手。我有一个类HowToPlay.h(当然也有.m)他们定义了两个数组

NSMutableArray *nibs;
NSMutableArray *unusedNibs;
@property (nonatomic, retain) NSMutableArray *nibs;
@property (nonatomic, retain) NSMutableArray *unusedNibs;
然后我们跳进.m, 我为阵列写了所有的东西,

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

然后我还有另一个名为Question 1的类,我需要能够在该类中使用此数组,并且能够更改它,但保留对HowToPlay.m文件的更改。

这就是为什么,基本上这个数组加载随机NIB文件,然后在使用它们时从数组中删除它们。

问题1中的

这里是我正在做什么来使用数组

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];
}

这一切似乎都运行正常,但我遇到的问题是,即使这一行运行,数组中的对象似乎也没有被删除

[self.unusedNibs removeObjectAtIndex:random];

我试过制作它

[HowToPlay.unusedNibs removeObjectAtIndex:random];

我收到错误expected '.' before '.' token

在我看来,我有权读取数组,但不能更改它。任何方法来解决这个问题,我可以改变阵列?感谢

更新:

这是整个HowToPlay.h文件内容:

#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"

我导入之后因为否则我得到错误

此外,我在HowToPlay的ViewDidLoad部分设置了数组,这是一个坏主意吗?

- (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];
}

2 个答案:

答案 0 :(得分:1)

如何检查对象是否实际被删除?请发布更多代码,因为从unusedNibs中删除对象的方式似乎没问题。根据此代码:

[self.unusedNibs removeObjectAtIndex:random];

和此代码

[HowToPlay.unusedNibs removeObjectAtIndex:random];

您收到此错误的原因是您尝试使用类名“HowToPlay”而不是其实例“self”访问unusedNibs。

答案 1 :(得分:1)

以下几点:首先,要在HowToPlay中调用unusedNib这样的属性,它看起来像是在调用类而不是实例。您需要创建一个HowToPlay对象并将其分配给Question1对象中的属性,以便一个Object可以调用的问题。 Question1不应该为unusedNib调用'self',因为它不拥有它。

通过你正在做的事情,将函数计算出HowToPlay类中的下一个随机控制器可能更有意义。这样你的问题视图控制器可以要求它返回下一个控制器,而不必在每个问题控制器上复制该代码。