如何将字符串保存到数组并在标签中显示字符串?

时间:2014-02-21 18:35:28

标签: ios objective-c ios7

我是iOS和Objective-C编程的新手,尝试(HARD)学习它,所以我已经注册了一门基础课程。我正在尝试在我的ViewController.m文件中实现两个IBAcion,但我似乎在思考这个问题的方式以及理解范围的困难方面存在问题,例如我能够和不能调用的内容等等。

其中一个IBAction将掷骰子,获得正确的图像,另一个将保存结果并显示最近的10次投掷。

请不要因为看起来很多代码而气馁。​​

这些是我在@interface(。h文件)

中声明的以下属性
@interface ViewController : UIViewController

@property (weak, nonatomic) IBOutlet UIImageView *dieOne;
@property (weak, nonatomic) IBOutlet UIImageView *dieTwo;
@property (weak, nonatomic) IBOutlet UILabel *latestTenThrows;

@property (nonatomic) NSUInteger dieValue1;
@property (nonatomic) NSUInteger dieValue2;
@property (nonatomic) NSUInteger totalValue;

@property (nonatomic) NSMutableArray *rolledDiceArray;
@property (nonatomic) NSMutableString *rolledDiceString;
@end

这是我的实施

- (IBAction)throwDice {

NSMutableArray *dieArray = [[NSMutableArray alloc] initWithObjects:
                            @"one", @"two", @"three", @"four", @"five", @"six", nil];

NSUInteger dieIndex1 = arc4random_uniform(6);
NSUInteger dieIndex2 = arc4random_uniform(6);

UIImage *image1 = [UIImage imageNamed:[dieArray objectAtIndex:dieIndex1]];
UIImage *image2 = [UIImage imageNamed:[dieArray objectAtIndex:dieIndex2]];

self.dieOne.image = image1;
self.dieTwo.image = image2;

到目前为止一切顺利,正确的图像正在显示,但这里对我来说变得棘手。我试图“保存”滚动的骰子值,并在这样的标签中显示它们:5 + 2 = 7在视图中,它应该显示最近的10次投掷。

self.dieValue1 = (dieIndex1+1);
self.dieValue2 = (dieIndex2+1);
self.totalValue = self.dieValue1 + self.dieValue2;

NSMutableString *rolledDiceString = [[NSMutableString alloc] init];

[rolledDiceString appendString:[NSString stringWithFormat:
                                 @"%d + %d = %d",
                                 self.dieValue1,self.dieValue2,self.totalValue]];

如何在我的另一个functicion - (IBAction)saveThrow{}下面获得此阵列的许可?

NSMutableArray *rolledDiceArray = [[NSMutableArray alloc]init];
[rolledDiceArray addObject:rolledDiceString];

如果我添加这个NSLog调用,我将只获得1,无论我在界面中点击“掷骰子”多少次,这意味着当我在界面中点击“掷骰子”时它没有放置值,在数组中正确创建一个字符串。 如何正确地将字符串添加到我的数组,以便我以后可以从另一个IBAction中检索该信息?我在下面的函数中是否拥有此数组的权限?

NSLog(@"%d",rolledDiceArray.count);
} // End for -(IBAction)throwDice{

在我的第二个也是最后一个IBAction中,我正在尝试将字符串添加到标签中,但是因为我的数组没有得到字符串而在这里遇到问题。

- (IBAction)saveThrow {
NSMutableArray *savedThrowsArray = [[NSMutableArray alloc] init];

[savedThrowsArray addObject:self.rolledDiceArray];

self.latestTenThrows.text = [// Latest 10 items (strings) in savedThrowsArray];

}

2 个答案:

答案 0 :(得分:1)

不要连枷;想想你在做什么。你的话(在你的代码中)有意思。电脑只能做你告诉它做的事情......!那么,让我们看看:

NSMutableArray *rolledDiceArray = [[NSMutableArray alloc]init];
[rolledDiceArray addObject:rolledDiceString];

每次运行该代码时,您都会创建一个全新的空可变数组(这是= [[NSMutableArray alloc] init]在第一行中的含义)。因此无论你运行多少次,结果数组都只包含一个对象(你在addObject的第二行添加的对象。)< / p>

NSMutableArray *savedThrowsArray = [[NSMutableArray alloc] init];
[savedThrowsArray addObject:self.rolledDiceArray];

同样的交易。

与此同时,你已经将这些完全不同的实例变量置于未使用状态:

@property (nonatomic) NSMutableArray *rolledDiceArray;
@property (nonatomic) NSMutableString *rolledDiceString;

但是你的代码永远没有和他们谈论过。他们只是坐在那里浪费。您需要初始化它们并将数据放入其中 - 而不是在您不断创建和丢弃的这些本地自动变量中。

答案 1 :(得分:0)

我认为错误就在这里:

NSMutableString *rolledDiceString = [[NSMutableString alloc] init];

这将创建一个覆盖类属性的方法的局部变量。因此,当它超出范围(即方法返回)时,它将被解除分配。 只需替换为

self.rolledDiceString = [[NSMutableString alloc] init];

对于数组也是如此 - 你应该分配一次(在init或viewDidLoad中)并且只使用

[self.rolledDiceArray addObject:self.rolledDiceString];