2012-06-07 67 views
0

我不知道爲什麼這很困難,但我無法得到它的工作。這是我的基本流程:從NSObject類傳遞一個值到UIViewController

我有一個UIViewController與一個子視圖UIView本身有一個子視圖UIButton。單擊按鈕實例化一個名爲TwitterController的NSObject新實例,爲twitter提要創建一個NSURL,然後將控制權交給TC進行URLConnection並序列化返回的數據。

下面是視圖控制器的相關代碼(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,我得到了Twitter的飼料,並在這裏對其進行處理:

- (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,但我似乎無法弄清楚如何。

我已經做了以下內容:

試圖從getTwitterFeed返回TweetArray但回來爲空(我的猜測是該方法返回的陣列之前連接過完)

試圖把它UserDefaults,但我保持null(與上面相同的猜測,但後來我把它放在connectionDidFinish,仍然爲空)

試圖將ViewController的引用傳遞給TwitterController,然後調用VC中的方法將數組傳遞給但在TwitterController我錯誤了,因爲它說我的VC實例不識別選擇器。 (它在那裏,我已經三重檢查)。

我相信這很簡單,我只是很密集,但有人可以幫助我呢?

編輯:這就是我試圖通過它回到VC:

我會VC.h通過VC採用這種方法TC(這是VC)

[twitterManager showTwitterFeed:vTwitterFeed:self]; 

我有一個*的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; 

和VC。米

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

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

您可以張貼在那裏你試圖把tweetArray在視圖控制器的代碼?及其定義? – giorashc

+0

是的,堅持幾秒鐘,我會在... – PruitIgoe

回答

0

不能從getTwitterFeed因爲connectionDidFinishLoading沒有被調用尚未返回。

你需要做的是在你的TwitterController中建立一個協議,並使你的ViewControllerdelegateTwitterController

然後,當connectionDidFinishLoading發生並且您保存twitter信息時,您可以將該功能調回回delegateViewController)。

TwitterController協議創建一個名爲像twitterDataReceived:(NSDictionary *)tweetDict功能,並調用它在connectionDidFinishLoading功能:[self.delegate twitterDataReceived:thisTweetDict];或者如果你只是想發送文本使其twitterTextReceived:(NSString *)theTweet並調用[self.delegate twitterTextReceived:tweet];或使用數組一樣twitterArrayReceived:(NSArray *)tweetArray[self.delegate twitterArrayReceived:tweetArray];,或任何你想發回。

如果你不熟悉設立協議和委託有許多可用的問題,這將幫助你,像這樣的:objective-c protocol delegates

0

因爲thisViewControllerUIViewController型,它就不您得到一個無法識別的選擇定義了這個方法

因此改變thisViewController類型的自定義視圖(雖然它不是從你貼我絕對相信是這樣的話,你會分配thisViewController = theViewControllertheViewController當得到一個編譯錯誤類型UIViewController的代碼所示)控制LER,改變它的

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

簽名是:

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

相關問題