1

这是一个objective-c问题。我创建了一个 NSObject 的子类 person,参数为“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

结束人.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

4

2 回答 2

1

您似乎将变量的声明与变量的分配混淆了。您也没有正确使用属性。

变量的声明是这样完成的:

Person *bob;

而已。如果你把这一行放在你的@interface 部分,或者在你的实现部分顶部的 {braces} 中,那么这将成为一个实例变量,任何时候你bob在你的类的其余部分中使用它都会知道你正在和一个人。因此,在您的 viewDidLoad 中,您现在可以这样做:

bob = [[Person alloc] init];

它知道您指的是实例变量。在您当前的代码中,您Person *在这一行前面,正如编译器告诉您的那样,它声明了一个名为 bob 的局部变量,因此隐藏了您的实例变量,因此您根本不会更改您的实例变量,所以以后没有任何价值。

看看这个问题的性质,以及您的评论,我强烈建议您先阅读一些 Objective-C 的介绍性文本,然后再继续进行。您可以在这里提问,但 SO 并不是真正学习语言的地方 - 大多数回答者会假设您了解语言基础知识。

于 2012-06-07T05:58:10.357 回答
1

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"];
于 2012-06-06T02:01:48.977 回答