Это проблема объектива-c. Я создал подкласса NSObject с параметрами «высота» и «вес», с свойством и синтезируемым в файле Person.h, который содержит как интерфейс, так и реализацию.Использование пользовательского подкласса объекта NS в двух разных IBActions
Я хочу импортировать 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 не может найти Боба, потому что это локальная переменная alterperson_1. Мой вопрос в том, как и где в viewcontroller.m я выделяю Боба как человека, чтобы его атрибуты могли быть изменены обоими IBActions.
Я попытался выделить в viewdidload, а также в методах initwith nibname. Это не работает. Я также пытался реализовать {} viewcontroller.m, но это не работает либо потому, что распределение Боба не является постоянной времени компиляции.
Спасибо!
Update с кодом
Итак, у меня есть файл Person.h импортируя правильно сейчас (спасибо Robotnik), и я в состоянии создавать экземпляры Person в течение ViewController.m - однако, мой созданный экземпляр * bob, похоже, не сохраняет значения для своих свойств (см. комментарии операторов NSLog в коде). Я думаю, что это проблема с инициализацией, но я не знаю, где инициализировать. В настоящее время я получаю предупреждение при инициализации в viewDidLoad. Как получить bob.weight для печати 200, когда вызывается мой IBAction, вместо 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
Не связано с вопросом, но не забывайте, что имена классов должны быть заглавные, чтобы отличать их от имен объектов. Кроме того, вам не хватает [из строки выделения персонажа (я предполагаю, что это только опечатка в вопросе, а не в вашем фактическом коде). –
Вы правы, это опечатка. И я предполагаю, что капитализация имен классов - это соглашение, поэтому я буду обновлять свою программу, чтобы следовать ей. Спасибо Адаму! – CaptainBear