2
- (void)viewDidLoad
{


    delegate = (AppDelegate*)[[UIApplication sharedApplication]delegate];

    birthdaylist=[[BirthdayList alloc]initWithNibName:@"BirthdayList" bundle:nil];

    spinner=[[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    spinner.alpha=1.0;
    spinner.center=CGPointMake(130, 150);
    [spinner setHidden:YES];


    UIButton *PickFriendsButton=[[UIButton alloc]init];
    [PickFriendsButton setFrame:(CGRectMake(100, 200, 150, 33))];
    [PickFriendsButton setBackgroundImage:[UIImage imageNamed:@"share_bg.png"] forState:UIControlStateNormal];
    [PickFriendsButton setTitle:@"Pick Friends" forState:UIControlStateNormal];
    [PickFriendsButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    [PickFriendsButton.titleLabel setFont:[UIFont fontWithName:@"Politica" size:15]];
    [PickFriendsButton addTarget:self action:@selector(PickFriends:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:PickFriendsButton];


    [super viewDidLoad];    

    FBLoginView *loginview = [[FBLoginView alloc] init];


    loginview.frame = CGRectOffset(loginview.frame, 5, 5);
    loginview.delegate = self;

    [self.view addSubview:loginview];

    [loginview sizeToFit];


    NSArray *permissions = [[NSArray alloc] initWithObjects:
                            @"user_birthday",@"friends_hometown",
                            @"friends_birthday",@"friends_location",@"basic_info",
                            @"user_location",
                            @"user_birthday",
                            @"user_likes",
                            nil];


    loginview.readPermissions = permissions;

    }

- (void)loginViewShowingLoggedInUser:(FBLoginView *)loginView

{
    // first get the buttons set for login mode


       NSLog(@"success");


    if (FBSession.activeSession.isOpen)
    {

        NSLog(@"TOKEN : %@",[[FBSession activeSession]accessTokenData]);


        FBRequest *friendRequest = [FBRequest requestForGraphPath:@"me/friends?fields=name,picture,birthday,location"];

        [friendRequest startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error)
        {
            NSArray *data = [result objectForKey:@"data"];
            for (FBGraphObject<FBGraphUser> *friend in data)
            {
                // NSLog(@"%@",friend);
                [delegate.friendsListArray addObject:friend];
                NSLog(@"%@:%@:%@", [friend name],[friend birthday],[friend id]);
            }
        }];
    }

    if ([delegate.friendsListArray count]!=0)

    {

        NSUserDefaults * standardDefaults=[NSUserDefaults standardUserDefaults];
        [[NSUserDefaults standardUserDefaults] synchronize];

        [standardDefaults setObject:delegate.friendsListArray forKey:@"FriendsListArray"];
        [standardDefaults setBool:YES forKey:@"logged_in"];
        [standardDefaults synchronize];

        NSLog(@"%@",[standardDefaults objectForKey:@"FriendsListArray"]);

        [self.navigationController pushViewController:birthdaylist animated:YES];

    }

}

它无法查看控制器。我不知道。有什么问题?有任何想法请帮助我。感谢您的帮助。

4

3 回答 3

0

首先:

  1. 检查您的 delegate.friendsListArray 中是否有任何数据。我看到你记录它。让我们在这里提供这些数据
  2. 我会将 if ([delegate.friendsListArray count]!=0) 中的所有代码删除到friendRequest startWithCompletionHandler 块中。当然在 for() 之后
  3. 如果以上都不适合你。试试这个替换下面的代码。然后开始逐步放置其他代码。

-(void)loginViewShowingLoggedInUser:(FBLoginView *)loginView {

   if (FBSession.activeSession.isOpen) {
      BirthdayList *birthdaylist=[[BirthdayList alloc]initWithNibName:@"BirthdayList" bundle:nil];
      [self.navigationController pushViewController:birthdaylist animated:YES];
   }
}

更多样品,你评论试试这个。我希望你能解决剩下的问题。

-(void)loginViewShowingLoggedInUser:(FBLoginView *)loginView {

   if (FBSession.activeSession.isOpen) {
      FBRequest *friendRequest = [FBRequest requestForGraphPath:@"me/friends?fields=name,picture,birthday,location"];
      [friendRequest startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error)
      {
          NSArray *data = [result objectForKey:@"data"];
          for (FBGraphObject<FBGraphUser> *friend in data)
          {
               [delegate.friendsListArray addObject:friend];
          }
          if ([delegate.friendsListArray count] > 0) {
              BirthdayList *birthdaylist=[[BirthdayList alloc]initWithNibName:@"BirthdayList" bundle:nil];
              [self.navigationController pushViewController:birthdaylist animated:YES];
          } else {
              UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Friend not found" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
              [alertView show];
          }
      }];

   }
}
}
于 2013-08-26T06:59:16.983 回答
0

尝试这个 -

首先在您的应用程序委托中实现所有 facebook sdk 委托方法。

- (IBAction)loginWithFacebookButtonTapped:(id)sender
{
    IntubeAppDelegate *delegat = (IntubeAppDelegate*)[[UIApplication sharedApplication] delegate];
    [delegat doLoginAndSwitch];
}

现在,在你的 appDelegate -

-(void) doLoginAndSwitch
{      
    [self openSessionWithAllowLoginUI:YES];
}

- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI
{
    NSArray *permissions = [NSArray arrayWithObjects:@"email", nil]; 
    return [FBSession openActiveSessionWithPublishPermissions:permissions
                                      defaultAudience:FBSessionDefaultAudienceFriends
                                         allowLoginUI:YES
                                    completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {

                                        [self sessionStateChanged:session
                                                            state:state
                                                            error:error];

                                    }];
}

-(BOOL)openSessionWithAllowPublishStreamPermission:(BOOL)allowLoginUI
{
    NSArray *permissions = [NSArray arrayWithObjects:@"publish_actions",@"publish_stream", nil];

    [[FBSession activeSession] requestNewPublishPermissions:permissions defaultAudience:FBSessionDefaultAudienceEveryone completionHandler:^(FBSession *session, NSError *error){
}];
     return YES;
}

- (void)sessionStateChanged:(FBSession *)session
              state:(FBSessionState)state
              error:(NSError *)error
{
    switch (state) {
        case FBSessionStateOpen:
            if(!error)
            {
              //  NSLog(@"FBSessionStateOpen :- logged in");

                [self openSessionWithAllowPublishStreamPermission:YES];

              // Your code
            }
    }    
} 

还可以切换回您的应用程序 -

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

我希望你现在能得到你想要的。:)

于 2013-08-26T09:17:39.277 回答
0

我已经完成了你的要求。我建议尝试使用这个:-

- (BOOL)handleOpenURL:(NSURL*)url;

它是一个辅助方法,用于提供一个实现, [UIApplicationDelegate applicationDidBecomeActive:]以正确解析 Facebook 登录流的会话状态,特别是支持app-switch login

例如 -

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
{
// We need to handle URLs by passing them to FBSession in order for SSO authentication to work.

return [FBSession.activeSession handleOpenURL:url];
}

我希望它能解决你的问题。如果你还有疑问,我会详细说明。

于 2013-08-26T07:21:33.070 回答