Как обновить переменную в одном классе из другого? - PullRequest
2 голосов
/ 14 августа 2010

Мне нужно установить переменную в классе A из класса B. Чтобы проверить это, у меня есть цикл while, работающий в классе A, который непрерывно печатает переменную через NSLog.Однако, что бы я ни пытался, я не могу заставить Класс B обновить переменную в Классе A таким образом, чтобы Класс A мог прочитать изменения, сделанные Классом B. Я уверен, что все правильно подключено в IB.Вот как у меня все настроено:

//Class A
@interface AppDelegate : NSObject {
    NSString *teststring;
}
@property(readwrite,nonatomic,retain) NSString *teststring;
@end

@implementation AppDelegate
@synthesize teststring;
-(id)init{
    self = [super init];
    if(self) {
        teststring = [[NSString alloc] init];
    }
    return self;
}
-(void)awakeFromNib
{
    while(1){
        NSLog(@"teststring is %@",teststring);
        usleep(500000);
    }
}
@end

//Class B
@class AppDelegate;
@interface otherClass : NSObject {
    AppDelegate *appdel;
}
-(IBAction)doTest:(id)sender;
@end

@implementation otherClass
-(void)awakeFromNib
{
    appdel = [[AppDelegate alloc] init];
}
-(void)doTest:(id)sender
{
    appdel.teststring = @"Test";
    NSLog(@"Set teststring to %@",appdel.teststring); //this works
}
@end

1 Ответ

2 голосов
/ 14 августа 2010

Вы слишком много думаете о классах (как, казалось бы, своего рода «отдел» кода) и недостаточно о предметах, и ваша формулировка и ваша проблема демонстрируют это.

У вас есть экземпляр otherClass, создающий второй экземпляр класса AppDelegate. У вас уже был один экземпляр AppDelegate, который является действительным делегатом приложения (потому что, я полагаю, он есть у вас в кончике и подключен к выходу delegate приложения); теперь, в -[otherClass awakeFromNib], вы создаете другое.

Затем вы указываете этому второму экземпляру AppDelegate установить для его свойства teststring значение @"Test", а затем запрашиваете у вашего второго экземпляра AppDelegate значение этого свойства, и ваш второй экземпляр AppDelegate покорно показывает Вы значение, которое вы дали ему.

Первый экземпляр не имеет того же значения для своего свойства teststring, поскольку объект otherClass никогда не давал этому экземпляру значение для своего свойства teststring. Обратите внимание, что переменные, которые вы определяете в разделе @interface, являются переменными instance , поэтому разные экземпляры класса могут и обычно будут иметь разные значения в этих переменных. Свойства аналогичны для каждого экземпляра и обычно поддерживаются этими переменными экземпляра.

AppDelegate A (реальный делегат приложения, созданный в nib) и AppDelegate B (созданный объектом otherClass, а не делегатом что-либо) - это два отдельных экземпляра AppDelegate, с отдельным teststring переменные.

Таким образом, решение: пусть экземпляр otherClass говорит с реальным делегатом приложения, а не с экземпляром AppDelegate, который он создал сам. Вы можете запросить у приложения его делегат или (если объект otherClass находится в перте MainMenu) дать ему выход для делегата приложения, так же как приложение.

Тем не менее, добавление слишком большого количества материала в класс делегата приложения - плохой дизайн; Каждый класс должен иметь одну конкретную цель и, как правило, должен вписываться в одну из классификаций Model, View и Controller. Итак, предполагая, что ваш otherClass объект должен быть контроллером, переместите свойство в otherClass и сделайте этот объект контроллером того, что нуждается в свойстве.

...