我是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];
}
答案 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];