2012-06-07 4 views
0

Я не знаю, почему это так сложно, но я не могу заставить это работать. Вот мой основной поток:Передача значения из класса NSObject обратно в UIViewController

У меня есть UIViewController с subview UIView, который сам имеет subview UIButton. Нажатие кнопки создает экземпляр NSObject, называемый TwitterController, создает NSURL для фида Twitter и затем передает управление TC, чтобы выполнить URLConnection и сериализовать возвращенные данные.

Вот соответствующий код в ViewController (Pruit_Igoe мне, не стесняйтесь следовать хотя я не отправляю много: D):

- (void) getTwitter { 

//load new manager 
twitterManager = [TwitterController new]; 
[twitterManager showTwitterFeed:vTwitterFeed:self]; 

NSURL* twitterFeedPath = [NSURL URLWithString: @"http://api.twitter.com/1/statuses/user_timeline.json?screen_name=Pruit_Igoe"]; 

[twitterManager getTwitterFeed:twitterFeedPath]; 

//toggle the twitter view 
[self toggleView:vTwitterFeed]; 
[self toggleView:vContactCard]; 

} 
  • showTwitterFeed сбрасывает объекты в поле зрения vTwitterFeed (кнопка закрыть вид, изображения и т.д.)
  • getTwitterFeed начинается процесс NSURLConnection

в TwitterController, я получаю щебет корма и обработать его здесь:

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

//do something with the data! 
NSError *e = nil; 
//parse the json data 
NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData: receivedData options: NSJSONReadingMutableContainers error: &e]; 

//dump it into an array 
tweetArray = [[NSMutableArray alloc] init]; 

for(NSDictionary* thisTweetDict in jsonArray) { 

    NSString* tweet = [thisTweetDict objectForKey:@"text"]; 
    [tweetArray addObject:tweet]; 
} 

} 

это все работает нормально, журнал tweetArray и весь текст есть, журнал thisTweetDict и все тонны данных Twitter отправляет обратно там. Проблема в том, что я хочу передать tweetArray обратно в ViewController, но я не могу понять, как это сделать.

Я сделал следующее:

Пробовал возвращение TweetArray из getTwitterFeed, но он вернулся в нуль (мое предположение, метод возвращал массив, прежде чем соединение кончила)

Пробовал ставить его в UserDefaults, но я продолжаю получать нуль (то же самое, что и выше, но потом я ввел его в connectionDidFinish и все еще null)

Пробовал передать ссылку на ViewController на TwitterController, а затем вызвать метод в VC, чтобы передать массив, но в TwitterController Я ошибаюсь, потому что говорит, что мой экземпляр VC не распознает ze селектор. (Там, я проверял тройку).

Я уверен, что это просто, и я просто плотный, но может ли кто-нибудь помочь мне с этим?

Edit: Вот как я пытался передать его обратно в VC:

Я хотел бы передать VC в TC, используя этот метод (это в VC)

[twitterManager showTwitterFeed:vTwitterFeed:self]; 

в VC.h я имел UIViewController * thisViewController

в VC.m в showTwitterFeed:

- (void) showTwitterFeed : (UIView*) theTwitterView : (UIViewController*) theViewController { 

    thisViewController = theViewController; 

    //...other code to build view objects 

затем в

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

... 

for(NSDictionary* thisTweetDict in jsonArray) { 

    NSString* tweet = [thisTweetDict objectForKey:@"text"]; 
    [tweetArray addObject:tweet]; 
} 

[thisViewController getTwitterFeed:tweetArray]; //<--this would error out saying selector not available 

назад в VC.h

- (void) getTwitterFeed : (NSArray*) theTwitterFeed; 

и в ВК.м

- (void) getTwitterFeed : (NSArray*) theTwitterFeed { 

    NSLog(@"%@", theTwitterFeed); 
} 
+0

Вы можете разместить код, в котором вы пытались поставить tweetArray в контроллере представления? и его определение? – giorashc

+0

Да, держись в течение нескольких секунд, и я получу его ... – PruitIgoe

ответ

0

Вы не можете вернуть его из getTwitterFeed потому connectionDidFinishLoading не была вызвана.

Что вам нужно сделать, это настроить протокол в вашем TwitterController и сделать свой ViewControllerdelegate из TwitterController.

После этого, когда connectionDidFinishLoading происходит, и вы экономите информацию о твиттере, вы можете позвонить функции обратно в delegate (ViewController).

Создайте функцию под названием что-то вроде twitterDataReceived:(NSDictionary *)tweetDict в протоколе TwitterController и вызвать его в функции connectionDidFinishLoading: [self.delegate twitterDataReceived:thisTweetDict]; или если вы просто хотите, чтобы отправить текст сделать его twitterTextReceived:(NSString *)theTweet и вызвать [self.delegate twitterTextReceived:tweet]; или использовать массив как twitterArrayReceived:(NSArray *)tweetArray и [self.delegate twitterArrayReceived:tweetArray];, или что-то вы хотите отправить обратно.

Если вы не знакомы с настройкой протокола и делегата есть много вопросов, доступных, которые помогут вам, как это одна: objective-c protocol delegates

0

Вы непризнанный селектор, потому что thisViewController имеет тип UIViewController, который не делает есть этот метод, определенный (хотя его не виден из кода, публикуемым Я абсолютно уверен, что это так, как вы получите ошибку компиляции при назначении thisViewController = theViewController и theViewController типа UIViewController)

Меняет thisViewController типа к настраиваемому зрению контроль Лер, а также изменить подпись

(void) showTwitterFeed : (UIView*) theTwitterView : (UIViewController*) theViewController

быть:

(void) showTwitterFeed : (UIView*) theTwitterView : (<Your custom controller type>*) theViewController

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