0

我不知道为什么这如此困难,但我无法让它发挥作用。这是我的基本流程:

我有一个带有子视图 UIView 的 UIViewController,它本身有一个子视图 UIButton。单击该按钮会实例化一个名为 TwitterController 的 NSObject 的新实例,为 twitter 提要创建一个 NSURL,然后将控制权交给 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 中,我获取 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 但我一直为空(与上面的猜测相同,但后来我把它放在 connectionDidFinish 中并且仍然为空)

试图将 ViewController 的引用传递给 TwitterController,然后在 VC 中调用一个方法将数组传递给但在 TwitterController 中我出错了,因为它说我的 VC 实例无法识别选择器。(它在那里,我已经检查了三次)。

我确信这很简单,我只是很密集,但有人可以帮我解决这个问题吗?

编辑:这是我尝试将其传递回 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;

在 VC.m 中

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

    NSLog(@"%@", theTwitterFeed);
}
4

2 回答 2

0

您得到一个无法识别的选择器,因为thisViewController它的类型UIViewController没有定义此方法(尽管从您发布的代码中看不到它,但我绝对确定这是这种情况,因为您在分配时会遇到编译错误 thisViewController = theViewController并且theViewControllertype is UIViewController

因此,将thisViewController类型更改为您的自定义视图控制器并更改签名

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

成为 :

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

于 2012-06-07T13:40:26.443 回答
0

您无法从其返回它,getTwitterFeed因为connectionDidFinishLoading尚未调用它。

您需要做的是在您的中设置一个协议,TwitterController并使您ViewController的.delegateTwitterController

然后,当connectionDidFinishLoading发生并保存 twitter 信息时,您可以将该函数调用回您的delegate( ViewController)。

创建一个twitterDataReceived:(NSDictionary *)tweetDictTwitterController协议中调用的函数并在connectionDidFinishLoading函数中调用它:[self.delegate twitterDataReceived:thisTweetDict]; 或者,如果您只想发送文本twitterTextReceived:(NSString *)theTweet,请调用[self.delegate twitterTextReceived:tweet];或使用数组,例如twitterArrayReceived:(NSArray *)tweetArrayand [self.delegate twitterArrayReceived:tweetArray];,或者您想要发回的任何内容。

如果您不熟悉设置协议和委托,有很多问题可以帮助您,例如:objective-c 协议委托

于 2012-06-07T13:23:11.823 回答