我不知道为什么这么困难但是我无法让它发挥作用。这是我的基本流程:
我有一个带有子视图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];
}
在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,但它返回null(我的猜测是在连接完成之前返回数组的方法)
试图把它放在UserDefaults中,但我一直都是null(与上面的猜测相同,但后来我将它放在connectionDidFinish中并且仍为null)
尝试将对ViewController的引用传递给TwitterController,然后在VC中调用一个方法将数组传递给但是在TwitterController中我出错了,因为它说我的VC实例无法识别选择器。 (它在那里,我已经三次检查)。
我确信这很简单,我只是在密集,但有人可以帮助我吗?
编辑:这是我试图将其传递给VC的方式:
我会使用这种方法将VC传递给TC(这是在VC中)
[twitterManager showTwitterFeed:vTwitterFeed:self];
在VC.h中我有一个UIViewController * thisViewController
在showTwitterFeed中的VC.m中:
- (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);
}
答案 0 :(得分:0)
您无法从getTwitterFeed
返回,因为尚未调用connectionDidFinishLoading
。
您需要做的是在TwitterController
中设置一个协议,并使ViewController
成为delegate
的{{1}}。
然后当TwitterController
发生并保存推特信息时,您可以将该功能调回connectionDidFinishLoading
(delegate
)。
在ViewController
协议中创建一个名为twitterDataReceived:(NSDictionary *)tweetDict
的函数,并在TwitterController
函数中调用它:connectionDidFinishLoading
或者如果您只想发送文本,请执行此操作[self.delegate twitterDataReceived:thisTweetDict];
并致电twitterTextReceived:(NSString *)theTweet
或使用[self.delegate twitterTextReceived:tweet];
和twitterArrayReceived:(NSArray *)tweetArray
之类的数据,或者您要发回的任何内容。
如果您不熟悉设置协议和代表,可以使用许多问题来帮助您,例如:objective-c protocol delegates
答案 1 :(得分:0)
你得到一个无法识别的选择器,因为thisViewController
的类型UIViewController
没有定义这个方法(尽管从你发布的代码中看不到它我绝对相信你的情况就是如此分配thisViewController = theViewController
和theViewController
类型为UIViewController
时出现编译错误
因此,将thisViewController
类型更改为自定义视图控制器,并更改
(void) showTwitterFeed : (UIView* ) theTwitterView : (UIViewController* ) theViewController
是:
(void) showTwitterFeed : (UIView* ) theTwitterView : (<Your custom controller type>* ) theViewController