在2个不同的IBActions中使用NS对象的自定义子类

时间:2012-06-06 01:29:43

标签: iphone objective-c xcode uiviewcontroller nsobject

这是一个客观问题。我创建了一个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

2 个答案:

答案 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 变量,因此隐藏了您的实例变量,所以你根本没有改变你的实例变量,所以以后没有任何价值。

看看这个问题的性质和你的意见,我强烈建议你阅读一些客观的介绍性文本,然后再继续讨论。你可以在这里提问,但这并不是学习语言的地方 - 大多数答案者会认为你懂得语言基础知识。