这是一个客观问题。我创建了一个NSObject的子类人员,其参数为' height'和' weight',使用属性并在名为Person.h的文件中进行综合,该文件包含接口和实现。
我想将Person.h导入我的viewcontroller.m并创建人物对象并使用2个IBActions更改它们。
-(IBAction)alterperson_1{
person *bob = [person alloc]init];
bob.height = 72;
bob.weight = 200;
}
-(IBAction)alterperson_2{
bob.height = 80;
bob.weight = 250;
}
这种安排不起作用,因为alterperson_2方法无法找到Bob,因为它是alterperson_1的局部变量。我的问题是我在viewcontroller.m中如何以及在何处将Bob分配为一个人,以便IBActions可以更改他的属性。
我尝试过在viewdidload和initwith nibname方法中进行分配。那没起效。我也尝试过viewcontroller.m的实现{},但由于Bob的分配不是编译时常量,因此无法工作。
谢谢!
使用代码更新
所以,我现在正在导入Person.h文件(感谢Robotnik),并且能够在整个ViewController.m中创建Person的实例 - 但是,我创建的实例* bob似乎不保留其属性的值(请参阅代码中的NSLog语句的注释)。我认为这是一个初始化问题,但我不知道在哪里初始化。目前,我在viewDidLoad初始化时收到警告。当我的IBAction被调用时,如何让bob.weight打印200,而不是我目前得到的0?感谢。
// Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject{
int weight;
int height;
}
@property int weight, height;
@end
结束Person.h
//Person.m
#import "Person.h"
@implementation Person
@synthesize weight, height;
@end
结束Person.m
//ViewController.h
#import <UIKit/UIKit.h>
#import "person.h"
@interface ViewController : UIViewController{
}
@property Person *bob;
-(IBAction)persontest:(id)sender;
@end
结束ViewController.h
//ViewController.m
#import "ViewController.h"
@implementation ViewController
@synthesize bob;
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
Person *bob = [[Person alloc]init]; // this causes a local declaration warning, if I remove this code, however, it still doesn't work
bob.weight = 100;
NSLog(@"viewDidLoad bob's weight, %i", bob.weight); // this will print 100, but only because I made the local initialization. The value is lost once the viewDidLoad Method ends.
}
-(IBAction)persontest:(id)sender{
bob.weight = bob.weight + 100;
NSLog(@"IBAction bob's weight %i", bob.weight); // this prints 0, probably because value is nil. How can I make it print 200?
}
- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
@end
结束ViewController.m
答案 0 :(得分:1)
如果您希望通过多种方法访问Bob,则需要在ViewController.h
中声明Bob。然后,您可以在viewDidLoad
@interface ViewController
{
Person *bob;
}
-(IBAction)alterperson_1;
-(IBAction)alterperson_2;
@end
你提到你想要实例化多个人。在这种情况下,您可能希望将多个Person对象保留在NSMutableArray
或类似对象中。这仍应在ViewController.h
中声明,以便可以通过多种方法访问。然后,您可以使用方法addObject:
将人员添加到数组中。这是一个存储字符串的数组示例。
NSMutableArray *stringArray = [[NSMutableArray alloc] init];
[stringArray addObject:@"Dog"];
[stringArray addObject:@"Cat"];
答案 1 :(得分:1)
您似乎混淆了变量的声明与变量的分配。您还没有正确使用属性。
变量声明如下:
Person *bob;
就是这样。如果你把这一行放在你的@interface部分,或者在你的实现部分顶部的{braces}中,那么只要你在其余部分使用bob
,这就变成了一个实例变量你的班级会知道你在和一个人说话。因此,在viewDidLoad中,您现在可以执行此操作:
bob = [[Person alloc] init];
它知道你指的是实例变量。在您当前的代码中,您在此行前面有Person *
,正如编译器告诉您的那样,它正在声明一个名为bob的 local 变量,因此隐藏了您的实例变量,所以你根本没有改变你的实例变量,所以以后没有任何价值。
看看这个问题的性质和你的意见,我强烈建议你阅读一些客观的介绍性文本,然后再继续讨论。你可以在这里提问,但这并不是学习语言的地方 - 大多数答案者会认为你懂得语言基础知识。