标签栏控制器和Facebook Connect问题Xcode 4.3 IOS 5.1

我正在尝试连接到Facebook并获取用户名称和图片,到目前为止我可以连接并获取用户名。 我有一个工作代码可以从这里下载(单一视图应用程序)

但是如果我把一个标签栏控制器放到代码中,它就无法收到来自facebook的回复。

我以编程方式添加了一个tabbar控制器,如app.m中的代码

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Regular Code /*self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease]; self.window.rootViewController = self.viewController; */ //Tab bar controller code self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; UIViewController *viewController1 = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease]; self.rootController = [[[UITabBarController alloc] init] autorelease]; self.rootController.viewControllers = [NSArray arrayWithObjects:viewController1, nil]; self.window.rootViewController = self.rootController; [self.window makeKeyAndVisible]; return YES; } // This method will be used for iOS versions greater than 4.2. - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [[_viewController facebook] handleOpenURL:url]; } 

如果我在行handleOpenurl中设置一个断点在NSUrl中有这个= fbAPPID://authorize/#access_token=BABABSbbsabsbabb我猜access_token意味着我已经成功了。 因此标签栏不会阻止我在Viewcontroller.m中登录blokcs我的facebook方法

没有标签栏Viewcontroller.m中的所有方法都很有效,当我添加标签栏和断点时,下面的facebook方法都不起作用。 我虽然没有任何错误。

 -(void)request:(FBRequest *)request didLoad:(id)result -(void)fbDidLogin 

ViewController.m

 #import "ViewController.h" #import "FBConnect.h" #import "Facebook.h" @implementation ViewController @synthesize btnLogin; @synthesize btnPublish; @synthesize lblUser; @synthesize actView; @synthesize facebook; @synthesize permissions; @synthesize isConnected; @synthesize imageView; // The alert view that will be shown while the game will upload to facebook. UIAlertView *msgAlert; - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } -(void)checkForPreviouslySavedAccessTokenInfo{ // Initially set the isConnected value to NO. isConnected = NO; // Check if there is a previous access token key in the user defaults file. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; if ([defaults objectForKey:@"FBAccessTokenKey"] && [defaults objectForKey:@"FBExpirationDateKey"]) { facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"]; facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"]; // Check if the facebook session is valid. // If it's not valid clear any authorization and mark the status as not connected. if (![facebook isSessionValid]) { [facebook authorize:nil]; isConnected = NO; } else { isConnected = YES; } } } -(void)setLoginButtonImage{ UIImage *imgNormal; UIImage *imgHighlighted; UIImageView *tempImage; // Check if the user is connected or not. if (!isConnected) { // In case the user is not connected (logged in) show the appropriate // images for both normal and highlighted states. imgNormal = [UIImage imageNamed:@"LoginNormal.png"]; imgHighlighted = [UIImage imageNamed:@"LoginPressed.png"]; } else { imgNormal = [UIImage imageNamed:@"LogoutNormal.png"]; imgHighlighted = [UIImage imageNamed:@"LogoutPressed.png"]; } // Get the screen width to use it to center the login/logout button. // We'll use a temporary image view to get the appopriate width and height. float screenWidth = [UIScreen mainScreen].bounds.size.width; tempImage = [[UIImageView alloc] initWithImage:imgNormal]; [btnLogin setFrame:CGRectMake(screenWidth / 2 - tempImage.frame.size.width / 2, btnLogin.frame.origin.y, tempImage.frame.size.width, tempImage.frame.size.height)]; // Set the button's images. [btnLogin setBackgroundImage:imgNormal forState:UIControlStateNormal]; [btnLogin setBackgroundImage:imgHighlighted forState:UIControlStateHighlighted]; // Release the temporary image view. [tempImage release]; } -(void)showActivityView{ // Show an alert with a message without the buttons. msgAlert = [[UIAlertView alloc] initWithTitle:@"My test app" message:@"Please wait..." delegate:self cancelButtonTitle:nil otherButtonTitles:nil]; [msgAlert show]; // Show the activity view indicator. actView = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0.0, 0.0, 40.0, 40.0)]; [actView setCenter:CGPointMake(160.0, 350.0)]; [actView setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleGray]; [self.view addSubview:actView]; [actView startAnimating]; } -(void)stopShowingActivity{ [actView stopAnimating]; [msgAlert dismissWithClickedButtonIndex:0 animated:YES]; } -(void)saveAccessTokenKeyInfo{ // Save the access token key info into the user defaults. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"]; [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"]; [defaults synchronize]; } #pragma mark - View lifecycle - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // Set the permissions. // Without specifying permissions the access to Facebook is imposibble. permissions = [[NSArray arrayWithObjects:@"read_stream", @"publish_stream", nil] retain]; // Set the Facebook object we declared. We'll use the declared object from the application // delegate. facebook = [[Facebook alloc] initWithAppId:@"331327710279153" andDelegate:self]; // Check if there is a stored access token. [self checkForPreviouslySavedAccessTokenInfo]; // Depending on the access token existence set the appropriate image to the login button. [self setLoginButtonImage]; // Specify the lblUser label's message depending on the isConnected value. // If the access token not found and the user is not connected then prompt him/her to login. if (!isConnected) { [lblUser setText:@"Tap on the Login to connect to Facebook"]; } else { // Get the user's name from the Facebook account. [facebook requestWithGraphPath:@"me" andDelegate:self]; } // Initially hide the publish button. [btnPublish setHidden:YES]; } - (void)viewDidUnload { [self setBtnLogin:nil]; [self setLblUser:nil]; [self setBtnPublish:nil]; [super viewDidUnload]; // Release any retained subviews of the main view. // eg self.myOutlet = nil; } -(void)request:(FBRequest *)request didReceiveResponse:(NSURLResponse *)response { // Keep this just for testing purposes. NSLog(@"received response"); } -(void)request:(FBRequest *)request didLoad:(id)result{ // With this method we'll get any Facebook response in the form of an array. // In this example the method will be used twice. Once to get the user's name to // when showing the welcome message and next to get the ID of the published post. // Inside the result array there the data is stored as a NSDictionary. if ([result isKindOfClass:[NSArray class]]) { // The first object in the result is the data dictionary. result = [result objectAtIndex:0]; } // Check it the “first_name” is contained into the returned data. if ([result objectForKey:@"first_name"]) { // If the current result contains the "first_name" key then it's the user's data that have been returned. // Change the lblUser label's text. [lblUser setText:[NSString stringWithFormat:@"Welcome %@!", [result objectForKey:@"first_name"]]]; // Show the publish button. [btnPublish setHidden:NO]; } else if ([result objectForKey:@"id"]) { // Stop showing the activity view. [self stopShowingActivity]; // If the result contains the "id" key then the data have been posted and the id of the published post have been returned. UIAlertView *al = [[UIAlertView alloc] initWithTitle:@"My test app" message:@"Your message has been posted on your wall!" delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil]; [al show]; [al release]; } } -(void)request:(FBRequest *)request didFailWithError:(NSError *)error{ NSLog(@"%@", [error localizedDescription]); // Stop the activity just in case there is a failure and the activity view is animating. if ([actView isAnimating]) { [self stopShowingActivity]; } } -(void)fbDidLogin{ // Save the access token key info. [self saveAccessTokenKeyInfo]; // Get the user's info. [facebook requestWithGraphPath:@"me" andDelegate:self]; } -(void)fbDidNotLogin:(BOOL)cancelled{ // Keep this for testing purposes. //NSLog(@"Did not login"); UIAlertView *al = [[UIAlertView alloc] initWithTitle:@"My test app" message:@"Login cancelled." delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil]; [al show]; } -(void)fbDidLogout{ // Keep this for testing purposes. //NSLog(@"Logged out"); // Hide the publish button. [btnPublish setHidden:YES]; } - (IBAction)LoginOrLogout { // If the user is not connected (logged in) then connect. // Otherwise logout. if (!isConnected) { [facebook authorize:permissions]; // Change the lblUser label's message. [lblUser setText:@"Please wait..."]; } else { [facebook logout:self]; [lblUser setText:@"Tap on the Login to connect to Facebook"]; } isConnected = !isConnected; [self setLoginButtonImage]; } - (IBAction)Publish { // Show the activity indicator. [self showActivityView]; // Create the parameters dictionary that will keep the data that will be posted. NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"My test app", @"name", @"http://www.google.com", @"link", @"FBTestApp app for iPhone!", @"caption", @"This is a description of my app", @"description", @"Hello!\n\nThis is a test message\nfrom my test iPhone app!", @"message", nil]; // Publish. // This is the most important method that you call. It does the actual job, the message posting. [facebook requestWithGraphPath:@"me/feed" andParams:params andHttpMethod:@"POST" andDelegate:self]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; } - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); } - (void)dealloc { [btnLogin release]; [lblUser release]; [btnPublish release]; [actView release]; [facebook release]; [permissions release]; [super dealloc]; } @end 

我很困惑如何让这个标签栏控制工作。

我改变了设计

现在首先显示登录视图然后它继续到具有标签栏控制器的真实应用程序。

问题是_viewcontroller facebook,当_viewcontroller被调用时它没有返回任何东西

 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [[_viewController facebook] handleOpenURL:url]; } 

所以我将我的代码(特别是_viewcontroller行)更改为下面的代码

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; UIViewController * viewController1 = [[[VoteMe alloc] initWithNibName:@"VoteMe" bundle:nil] autorelease]; UIViewController *viewController2 = [[[PostController alloc] initWithNibName:@"PostController" bundle:nil] autorelease]; UIViewController *viewController3 = [[[FriendsController alloc] initWithNibName:@"FriendsController" bundle:nil] autorelease]; UIViewController *viewController4 = [[[Responses alloc] initWithNibName:@"Responses" bundle:nil] autorelease]; UIViewController *viewController5 = [[[User alloc] initWithNibName:@"User" bundle:nil] autorelease]; self.rootController = [[[UITabBarController alloc] init] autorelease]; self.rootController.viewControllers = [NSArray arrayWithObjects:viewController1,viewController2,viewController3,viewController4,viewController5, nil]; self.window.rootViewController = self.rootController; [self.window makeKeyAndVisible]; loginView=[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; [self.window addSubview:loginView.view]; return YES; } // This method will be used for iOS versions greater than 4.2. - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [[loginView facebook] handleOpenURL:url]; } 

它工作正常