2012-02-20 2 views
0

Я размышлял над днем ​​о одной зависимости, с которой я столкнулся. Я новичок в Objective-C, поэтому, пожалуйста, успокойтесь. Я даже не знал, как решить проблему, с которой я столкнулся.Зависимость трех классов - возвращаемые данные

У меня есть три класса:

  1. RootViewController
  2. HttpRequestWrapper
  3. ManagementClass

Где RootViewController наследует ManagementClass. (@interface RootViewController : ManagementClass <UINavigationControllerDelegate>).

Так ManagementClass я называю эту функцию:

[[self.navigationController topViewController] getTableData]; 

где topViewController является RootViewController (но позже я хочу изменить его на любой topViewController в данный момент).

Эта функция getTableData вызывает HttpRequestWrapper и в ней URLConnection вызывается со всеми ее делегатами. Но когда дело доходит до метода делегата - (void)connectionDidFinishLoading:(NSURLConnection *)connection Я хочу с NSNotification уведомить RootViewController, что загрузка данных из запроса выполняется и заполнение таблицы данными. Но NSNotification не уведомляет RootViewController, даже если это topViewController в стеке навигации.

Так что мой вопрос в том, как я могу получить данные обратно с URLConnection в RootViewController, хотя запрос был инициализирован с помощью ManagementClass.

Вот немного кода моей проблемы:

Класс RootViewController:

#import "RootViewController.h" 
...... 

// Get the data using the class HttpRequstWrapper (where I wrap the request in NSURLConnection) 
- (void) getTableData{ 
    httpRequestWrapper = [HttpRequestWrapper alloc]; 
    [httpRequestWrapper getXMLDataWithURL:[NSString stringWithFormat:@"equipment/xml"]]; 
} 
- (void) viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    // Get Table Data 
    [self getTableData]; 
} 

- (void) populateTableData{ 

    // Maybe change this line that error is shown if no data is found 
      if (httpRequestWrapper.dataFromTheHttpRequest == nil){ 
     NSLog(@"Data got from the HttpRequestWrapper is nil or empty"); 
    } 

    // Parse the returned data 
    xmlcont = [[XMLController alloc] loadXMLByURL:httpRequestWrapper.dataFromTheHttpRequest]; 

    // Get the names of the Equipments as names of each Section 
    arrayEquipments = [NSMutableArray alloc]; 
    arrayEquipments = xmlcont.equipments; 
    sectionsTitles = [[NSMutableArray alloc]init]; 
    for (Equipment *eq in arrayEquipments){ 
     [sectionsTitles addObject: eq.equipmentName]; 
    } 

    // Reload the data in TableView 
    [self.tableView reloadData]; 
} 

- (void) viewDidLoad{ 
    .... 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(populateTableData) name:@"connectionFinishedLoading" object:nil]; 

} 

Класс ManagementClass: в файле .h

@interface ManagementClass : UITableViewController {} 

в файле .m

@implementation ManagementClass 

- (void) refreshPage { 
    if ([[self.navigationController topViewController] isKindOfClass: [RootViewController class]]){ 
     [[self.navigationController topViewController] getTableData]; 
    } 
} 

И в HttpRequestWrapper классе у меня есть:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
...... 
     if ([urlExtension rangeOfString: @"notification"].location != NSNotFound) { 
      [[NSNotificationCenter defaultCenter] postNotificationName:@"connectionFinishedLoading1" object:nil]; 
     } else if ([urlExtension rangeOfString: @"execution/workflow"].location != NSNotFound) { 
      [[NSNotificationCenter defaultCenter] postNotificationName:@"connectionFinishedLoadingPhaseView" object:nil]; execution/workflow 

     } else if ([urlExtension rangeOfString: @"equipment/xml"].location != NSNotFound) { 
     //[[self.navigationController topViewController] populateTableData]; - not working 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"connectionFinishedLoading" object:nil]; 
    } 
....... 
} 

Я хочу способ сделать контроллеры, как многоразовые, насколько это возможно. У меня возникла идея поместить [[self.navigationController topViewController] populateTableData] в connectionDidFinishLoading, но контроллер навигации не может быть вызван с HttpRequstWrapper, он просто не выполняется. Я до сих пор не могу понять, почему. Я могу только выполнить методы navigationController с ViewControllerView, который виден в данный момент.

ответ

0

Из того, что я вижу, вы слушаете «connectionFinishedLoading» в RootViewController, и вы публикуете «connectionFinishedLoading1» в HttpRequestWrapper.Они должны быть одинаковыми, чтобы их поймал RootViewController

+0

Извините, я не скопировал правильную вставку последней части команд if. Виноват. Теперь я отредактировал сейчас со всеми Ifs. Вся цель кода заключается в том, что я загружаю таблицу после представления представления и в следующий раз хочу обновить данные таблицы, если на сервере есть изменения. Поэтому во второй раз я вызываю getTableData из класса Management, но мне нужно уведомить RootViewController, когда данные закончили загрузку и перезагрузку данных. – Lily

+0

Мне удалось вызвать [[self.navigationController topViewController] populateTableData]; в классе httpRequestWrapper с помощью этого метода: MyAppDelegate * appDel = (MyAppDelegate *) [[UIApplication sharedApplication] delegate]; а затем [[appDel.navigationController topViewController] populateTableData]; Я думаю, что это не лучшее решение, но все работает отлично. – Lily

Смежные вопросы