Обновить UILabel из приложения DidBecomeActive? - PullRequest
1 голос
/ 16 февраля 2011

Я хочу обновить UILabel, нажав кнопку перезагрузки.Кроме того, я хочу обновить метку в фоновом режиме, потому что она загружает новые данные через XML с моего сайта.Конечно, было бы неплохо автоматически обновить метку при открытии приложения.И есть моя проблема:

Мне удалось заставить его работать хорошо, когда пользователь нажимал кнопку вручную.Но я не понимаю, как сделать то же самое, вызвав мой метод через «applicationDidBecomeActive».Я пытался сделать это таким же образом, но это, очевидно, не работает, потому что мой ярлык возвращается ноль.

Я полагаю, есть проблема моего понимания, и решение должно быть довольно простым.Спасибо за ваш вклад!Примечание: я новичок в Objective-C, и иногда у меня возникают проблемы с «простыми» вещами.; -)

Ниже приведена сводка важных частей кода:

AppDelegate

- (void)applicationDidBecomeActive:(UIApplication *)application {
    [[MyViewController alloc] reloadButtonAction];
 }

MyViewController

@synthesize label

- (void)reloadButtonAction {
    [self performSelectorInBackground:@selector(updateData) withObject:nil];
}

- (void)updateData {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    // Parse the XML File and save the data via NSUserDefaults
    [[XMLParser alloc] parseXMLFileAtURL]; 

    // Update the labels  
    [self performSelectorOnMainThread:@selector(updateLabels) withObject:nil waitUntilDone:NO];

    [pool release];
}

- (void)updateLabels {
    NSUserDefaults *variable = [NSUserDefaults standardUserDefaults];
    myLabel.text = [variable stringForKey:@"myLabelText"];

    // myLabel is nil when calling all of this via AppDelegate
    // so no changes to the myLabel are done in that case
    // but: it works perfectly when called via button selector (see below)
    NSLog(@"%@",myLabel.text);
}

-(void)viewDidLoad {
    // Reload button in the center
    UIButton *reloadButton = [UIButton buttonWithType:UIBarButtonSystemItemRefresh];
    reloadButton.frame = CGRectMake(145,75,30,30);  
    [reloadButton setTitle:@"" forState:UIControlStateNormal];
    [reloadButton addTarget:self action:@selector(reloadButtonAction) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:reloadButton];
}

1 Ответ

3 голосов
/ 16 февраля 2011

Первый:

[[MyViewController alloc] reloadButtonAction];

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

[myViewControllerInstance reloadButtonAction];

В вашем делегате приложения должна быть ссылка на ваш экземпляр rootcontroller, если этот объект содержит метод reload, используйте этот экземпляр.1008 * Примечание: Alloc резервирует место в памяти только для объекта, размер которого соответствует размеру экземпляра MyViewController.Метод init заполнит его.

...