Я целый день думал об одной зависимости, с которой я столкнулся.Я новичок в Objective-C, поэтому, пожалуйста, будьте спокойны со мной.Я даже не знал, как гуглить проблему, с которой столкнулся.
У меня есть три класса:
RootViewController
HttpRequestWrapper
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
с ViewController
из View
, который виден в данный момент.