Почему моя строка не отображается в UIAlertView - PullRequest
3 голосов
/ 21 октября 2011

Во-первых, я тщательно исследовал это и не смог найти ничего, что соответствовало бы тому, что я искал.

Моя проблема заключается в следующем: у меня есть строковое свойство, созданное в Class1 и затем синтезированное, как показано ниже.

@interface Class1 : UIViewController 
{
    NSString *testvar;
}

@property (nonatomic, retain) NSString *testvar;

@end



@implementation Class1

@synthesize testvar

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.testvar = @"Test variable";
}
@end

Это прекрасно работает для определения значения переменной / свойства, так как оно работает в тесте UIAlertView, отображаемом тем же методом viewDidLoad, в котором он определен. Проблема возникает, когда другой класс, Class2, пытается получить и использовать собственность. Код, используемый во втором классе, выглядит следующим образом:

Class1 *foo = [[Class1 alloc]init];
UIAlertView *alert = [[UIAlertView alloc]initWithTitle: @"Title"
                                               message:foo.testvar
                                              delegate:self
                                     cancelButtonTitle:@"OK"
                                     otherButtonTitles:nil];
[alert show];
[alert release];
[foo release];

Что происходит, так это то, что UIAlertView отображается, но не имеет сообщения. Я полагаю, что значение свойства testvar Class1 высвобождается до того, как Class2 попытается получить его, или я задаю его неправильно. Я говорю это, потому что я пытался сделать то же самое, но использовал int вместо NSString. Я установил значение int в 3 в Class1's viewDidLoad, и когда отобразился UIAlertView, он показал значение int, но отобразил «0», значение по умолчанию для int, а не мое заданное значение.

Будучи относительно новым для Objective-C и не обладая отличным знанием управления памятью, я думаю, что ошибка как-то связана с тем, где или как я устанавливаю значение моего свойства. Любое понимание будет оценено. Заранее спасибо.

Ответы [ 3 ]

6 голосов
/ 21 октября 2011

Вы делаете это неправильно.Метод viewDidLoad вызывается только тогда, когда это представление рисуется, а не при инициализации его в другом классе.

Определите метод в Class1 - (id) init и переместите свое self.testvar = @ "Test Variable";внутрь.Тогда все должно работать как положено.

- (id)init
{
   if(self = [super init])
   {
     self.testvar = @"Test Variable";
   }
   return self;
}
0 голосов
/ 22 августа 2013

Для этого вы можете использовать глобальную переменную.

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

Как вы можете объявить строку в ClassA и использовать ее в ClassB.

ClassA:

NSString *textVar = nil;

textVar = @"Your Message";

ClassB:

extern NSString *textVar;

UIAlertView *alert = [[UIAlertView alloc]initWithTitle: @"Title
                                 message:textVar     
                                 delegate:self
                                 cancelButtonTitle:@"OK"
                                 otherButtonTitles:nil];
                                 [alert show];
                                 [alert release];
0 голосов
/ 21 октября 2011

Вы еще ничего не назначили testvar. В этот момент он все еще будет нулевым объектом.

Вам нужно пойти что-то вроде

foo.textvar = @"my message";

на основе вашего кода выше в любом случае.

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

Не могли бы вы вставить полный код для лучшего понимания?

...