Как правильно динамически создавать контент для UIView?

У меня есть tableView со списком элементов. Когда выбор сделан, новый контроллер представления помещается в стек tableView navigationController viewController.

Мой вопрос таков: одно из представлений в иерархии представлений, связанное с выталкиваемым контроллером представления, требует извлечения данных из сети, прежде чем оно сможет отобразить его содержимое. Эта выборка выполняется асинхронно через [NSURLRequest requestWithURL: ...]. Каков правильный способ передать данные в представление, которое в них нуждается, и заставить это представление вызывать его перегруженный метод drawRect? В настоящее время делаю так:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {


    [_connection release];
    _connection = nil;

    [self performSelectorOnMainThread:@selector(GetDataFromCloudAndCreateView)
                        withObject:nil 
                     waitUntilDone:NO];


}

Метод GetDataFromCloudAndCreateView создает экземпляр представления из данных. К сожалению, ничего не рендерится. Я пробовал [myView setNeedsDisplay], но это не помогло.

Может кто-нибудь набросать правильный способ сделать это? Спасибо.


person dugla    schedule 30.09.2009    source источник
comment
Можете ли вы показать метод GetDataFromCloudAndCreateView?   -  person Valerii Hiora    schedule 01.10.2009
comment
Валерий, GetDataFromCloudAndCreateView создает экземпляр подкласса UIView - с переопределенным drawRect, который зависит от данных, полученных из облака. Моя задача состоит в том, как сообщить Cocoa-Touch, что я хочу, чтобы этот подкласс UIView отображал себя. В настоящее время этого не происходит, несмотря на [muView setNeedsDisplay]   -  person dugla    schedule 01.10.2009


Ответы (1)


В прошлом в подобном случае я создал новый UIViewController в методе connectionDidFinishLoading:, а затем протолкнул его. Вот так:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    [_connection release];
    _connection = nil;

    // Code to stop a loading indicator of some kind

    UIViewController *newView = [[SomeViewController alloc] initWithData:fetchedData];
    [self.navigationController pushViewController:newView animated:YES];
}

Метод initWithData: в новом контроллере заботится о любых переменных экземпляра, которые ему нужны, на основе данных, которые я ему передал, а затем, когда представление загружается, он будет рисовать представление на основе этих переменных.

Надеюсь это ответит на твой вопрос.

person Cory Kilger    schedule 30.09.2009
comment
Кори, я так понимаю, приведенный выше код работает у вас в tableViewController правильно? Так, например, в методе tableView: accessoryButtonTappedForRowWithIndexPath: вместо немедленного нажатия viewController вы откладываете нажатие viewController до вызова connectionDidFinishLoading:? - person dugla; 01.10.2009
comment
Думаю, у меня есть надежное решение. Я принял вашу идею создания представлений в connectionDidFinishLoading: но я реализовал connectionDidFinishLoading: в перемещаемом viewController. Он вызывается из viewDidAppear: что позволяет полностью установить ранее существовавшую иерархию представлений. Затем я просто добавляю подпредставления в методе, который я вызываю - в основном потоке - из connectionDidFinishLoading: этот подход не так похож на борьбу с Cocoa. Спасибо за помощь. - person dugla; 01.10.2009