Изменение Label.text из функции void в MainViewController, который вызывается из отдельного класса - PullRequest
1 голос
/ 14 февраля 2012

У меня есть контроллер основного вида с кнопкой, прикрепленной к IBAction под названием REFRESH(). В действии REFRESH() я вызываю функцию в классе, которая выполняет асинхронный запрос XML от WebService и создает объект из этих данных.

На контроллере основного представления есть еще одна функция `` (void) RECEIVED_DATA (), которая принимает объект, созданный из XML, в моем файле класса. Эта функция вызывается из моего файла класса только после того, как данные были получены обратно с сервера. В этот момент я хочу установить текст на метке в моем главном контроллере вида. К сожалению, я не могу. Я МОГУ изменить текст label.text в функции REFRESH(), прикрепленной к нажатию кнопки, но НЕ МОГУ изменить его в функции void, которая вызывается при возврате данных из файла класса.

Вот две функции:

-(void)refresh
{
    funcs *fn = [[funcs alloc]init]; //this is my class file which handles http request and response
    [fn GetData];
}



-(void)received_Data:(DataObject *)x
{
    myLabel.text = [x displayData]; //myLabel is a UILabel on my MainViewController and the displayData function returns an NSString.  It won't even let me use myLabel.text = @"test";  Nothing happens.
}

Стоит ли искать способ связать функцию RECEIVED_DATA() с функцией viewDidLoad()?

ОБНОВЛЕНИЕ - Другой пользователь указал, что, поскольку данные извлекаются отдельным потоком, они не могут влиять на любой пользовательский интерфейс, поскольку пользовательский интерфейс работает в основном потоке. Я опубликую отдельный вопрос, чтобы узнать, есть ли у кого-нибудь подход к этой проблеме.

Ответы [ 2 ]

2 голосов
/ 14 февраля 2012

Если ваш UILabel myLabel определен как IBOutlet, вы можете вызвать

self.myLabel.text = @"blah";

в любом месте этого класса viewcontroller.

Итак, правильно ли определена и подключена метка как IBOutlet?

Редактировать:

Оказывается, это тот случай, когда класс B вызывает метод в MainViewController.В методе в MainViewController вы можете обновить текст метки.Используйте протокол для правильного делегирования вызова метода.

1 голос
/ 05 сентября 2015

Использовать делегирование или KVO или NSnotifaction. Я понимаю, вы проблема пользователя.

Итак, если вы создадите экземпляр вашего основного контроллера представления и попросите его установить / обновить свойство label, то это станет новым объектом с текстом обновления.

Поскольку вы используете асинхронный метод и временные рамки возвращаемого значения непредсказуемы, я предлагаю вам использовать NSnotification, если вы хотите, чтобы передача сообщений выглядела просто, иначе перейдите к делегированию. На самом деле попробуйте реализовать все из них. У вас будет четкое представление.

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