Переменная доступа из другого класса - Objective-C - PullRequest
2 голосов
/ 06 ноября 2010

Этот вопрос, возможно, задавался ранее, поэтому я извиняюсь.

Я работаю над приложением для iPhone и скажу, что у меня есть переменная, var, в class1.Я хочу добавить UIButton в class2, который при попадании сбрасывает var до 0. Значение var сохраняется, когда приложение закрывается, поэтому, когда представление загружает var, присваивается значение (я полагаю, что вы, ребята, могли это понять, но я понялуточнил бы код).Как я могу написать что-то подобное?Вот в основном то, что я пытался:

@interface Class1 { 
    double var;
}
-(void)resetVar;
@end

@implementation Class1
-(void)viewDidLoad {
    NSUserDefaults *loadCount = [NSUserDefaults standardUserDefaults];
    var = [loadNoCount doubleForKey:@"count"];
}
-(void)resetVar {
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"count"];
    var = 0;
}


@interface Class2 { 
    Class1 *classObj;
}
@property(nonatomic, retain) Class1 *classObj;
-(IBAction)reset:(id)sender;
@end

@implementation Class2

-(void)viewDidLoad {
    classObj = [[Class1 alloc] init];
}
-(IBAction)reset:(id)sender {
    [classObj resetVar];
}
@end

Ответы [ 3 ]

1 голос
/ 06 ноября 2010

Используйте метод установки -setVar: или аналогичный для класса, в котором вы хотите установить переменную. Вы не можете получить доступ к переменным экземпляра других объектов: по умолчанию они все закрытые.

0 голосов
/ 28 января 2011

Проблема с фрагментом кода, который вы показываете, заключается в том, что NSUserDefaults записывает значения на диск только при выходе из приложения (или, возможно, также, когда оно отправляется в фоновый режим в iOS 4).Если вам нужно заставить NSUserDefaults записывать значения ключей на диск, вызовите для него метод [[NSUserDefaults standardUserDefaults] synchronize].

Кроме того, вместо использования removeObjectForKey: в resetVar, почему бы не использовать setDouble:forKey: вместо этого?Таким образом, вы также можете избавиться от «двойного var» ivar в Class1, просто используя NSUserDefaults в качестве хранилища данных.

Вот немного информации о методе синхронизации из документации NSUserDefaults:

Поскольку этот метод вызывается автоматически с периодическими интервалами, используйте этот метод только в том случае, если вы не можете ждать автоматической синхронизации (например, если ваше приложение собирается завершиться) или если вы хотите обновить пользовательские настройки по умолчанию начто находится на диске, даже если вы не внесли никаких изменений.

Вот как я бы реализовал то, что вы описали в своем коде:

@interface Class1 
{
}
- (void)resetVar;
@end

@implementation Class1
- (void)viewDidLoad 
{
    [self resetVar];
}
- (void)resetVar 
{
    [[NSUserDefaults standardUserDefaults] setDouble:0.0 forKey:@"count"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}
@end

@interface Class2 
{ 
    Class1 *classObj;
}
- (IBAction)reset:(id)sender;
@end

@implementation Class2
- (void)dealloc 
{
    [classObj release];
}
- (void)viewDidLoad 
{
    classObj = [[Class1 alloc] init];
}
- (IBAction)reset:(id)sender 
{
    [classObj resetVar];
}
@end
0 голосов
/ 06 ноября 2010

Попробуйте использовать синглтон http://developer.apple.com/library/mac/#documentation/General/Conceptual/DevPedia-CocoaCore/Singleton.html Если вы не можете понять это, прочитав это, дайте мне знать, и я приведу пример!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...