2012-06-06 1 views
1

Это проблема объектива-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

+0

Не связано с вопросом, но не забывайте, что имена классов должны быть заглавные, чтобы отличать их от имен объектов. Кроме того, вам не хватает [из строки выделения персонажа (я предполагаю, что это только опечатка в вопросе, а не в вашем фактическом коде). –

+0

Вы правы, это опечатка. И я предполагаю, что капитализация имен классов - это соглашение, поэтому я буду обновлять свою программу, чтобы следовать ей. Спасибо Адаму! – CaptainBear

ответ

1

Вы должны объявить Боб в вашем ViewController.h, если вы хотите, чтобы он был доступен по нескольким методам. Затем вы можете инициализировать его в 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"]; 
+0

Спасибо за ваш быстрый ответ. Я несколько раз пытался выделить человека * bob в viewDidLoad, но тогда * bob все еще недоступен в моих IBActions. Я использую ARC, может это проблема? Мои объекты выпускаются слишком рано? – CaptainBear

+1

Но вы объявили его в файле .h, как предложил Роботник? Этот подход (объявления * bob) будет работать только в том случае, если вы знаете все имена объектов Person, которые собираетесь использовать, поскольку вы должны объявить свойство или ivar для каждого из них. Добавление их в коллекцию сохранит их (если массив или набор сохранен), так что это, вероятно, так, как вы хотите. – rdelmar

+0

Итак, я собираюсь по-настоящему сделать это здесь. Если я импортирую person.h в viewcontroller.h, тогда я получаю ошибку компоновщика с ошибкой при сборке. Я предполагаю, что это потому, что person.h импортируется в viewcontroller.h, а затем снова импортируется в viewcontroller.m, который создает несколько копий person.h. Вот почему я только пытался разобраться с файлом .m. – CaptainBear

1

Вы, кажется, вводите в заблуждение объявление переменной с присвоением переменной. Вы также не используете свойства должным образом.

Декларация переменной делается так:

Person *bob; 

Вот и все. Если вы поместите эту строку в свой раздел @interface или в {braces} в верхней части раздела реализации, то это станет переменной экземпляра , в любое время, когда вы используете bob в остальной части своего класса, он будет знать, что вы разговаривая с человеком. Таким образом, в вашем viewDidLoad, теперь вы можете это сделать:

bob = [[Person alloc] init]; 

И знает, что вы имеете в виду переменную экземпляра. В вашем текущем коде у вас есть Person * перед этой строкой, которая, как говорит вам компилятор, объявляет переменную local с именем bob и, следовательно, скрывает вашу переменную экземпляра, поэтому вы не изменяете свою переменную экземпляра вообще, поэтому в этом нет никакой ценности.

Глядя на природу этого вопроса и ваши комментарии, я настоятельно рекомендую прочитать некоторые вводные тексты с объективным текстом, прежде чем продолжить гораздо дальше. Здесь вы можете задавать вопросы, но на самом деле это не место для изучения языка. Большинство ответчиков предположит, что вы знаете основы языка.

+0

Я застрял на этом в течение 2 дней. Хотя у меня есть опыт работы на C++, SQL, SAS, Visual Basic, Objective C совершенно для меня совершенно. Я сделал все Учебники New Boston по Objective C, которые были действительно полезны, но да, я делал немало новичков. Эта особая проблема сводила меня с ума, вот почему я спросил SO. Спасибо за вашу помощь, и я посвящу немного больше времени в эти выходные на уроки. – CaptainBear