将值从NSObject类传递回UIViewController

时间:2012-06-07 12:21:35

标签: ios objective-c cocoa-touch methods uiviewcontroller

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

我有一个带有子视图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,但它返回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);
}

2 个答案:

答案 0 :(得分:0)

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

您需要做的是在TwitterController中设置一个协议,并使ViewController成为delegate的{​​{1}}。

然后当TwitterController发生并保存推特信息时,您可以将该功能调回connectionDidFinishLoadingdelegate)。

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 = theViewControllertheViewController类型为UIViewController时出现编译错误

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

的签名

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

是:

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