如何将 loginViewFetchedUserInfo: 中的信息一次传递给多个视图

Posted

技术标签:

【中文标题】如何将 loginViewFetchedUserInfo: 中的信息一次传递给多个视图【英文标题】:How do i pass info from loginViewFetchedUserInfo: to multiple views at once 【发布时间】:2014-07-17 11:39:22 【问题描述】:

嗨,我正在尝试将 user.id 和 user.name 从 loginViewFetchedUserInfo 传递到我的 menuViewController、profileViewController 和 settingViewController 到目前为止,我已将信息发送到 profileViewController:

// this method will be called when the user information has been fetched
- (void)loginViewFetchedUserInfo:(FBLoginView *)loginView user:(id<FBGraphUser>)user

//    self.profilePictureView.profileID = user.id;
//self.FBProfilePicture.profileID = user.id;

_profilePicture = user;
_FBNameString = user.name;

NSLog(@"%@, name from Login", _FBNameString);


[self pushViewController:user.name andProfilePicture:_profilePicture];



- (void)pushViewController:(NSString *)userName andProfilePicture:(id<FBGraphUser>)profilePicture


//    MenuViewController *menu = [self.storyboard instantiateViewControllerWithIdentifier:@"MenuViewController"];
//    [menu setFBName:userName];
//    [menu setFBProfilePic:profilePicture];
//
//    SettingViewController *setting = [self.storyboard instantiateViewControllerWithIdentifier:@"SettingViewController"];
//    [setting setFBName:userName];
//    [setting setFBProfilePic:profilePicture];

//    NSLog(@"%@",profilePicture);


//    [self.navigationController pushViewController:controller animated:NO];




我只能接收 profileViewController 中的信息,而不能接收其他我使用协议的 setter 和 getter,但我无法将其发送到另一个 viewController

【问题讨论】:

【参考方案1】:

一般来说你的方法应该是这样的。(你可能需要根据需要进行调整)

// this method will be called when the user information has been fetched
-(void)loginViewFetchedUserInfo:(FBLoginView *)loginView user:(id<FBGraphUser>)user

//    self.profilePictureView.profileID = user.id;
//self.FBProfilePicture.profileID = user.id;

_profilePicture = user.picture;//assuming you may be having picture property for object user
_FBNameString = user.name;

NSLog(@"%@, name from Login", _FBNameString);

//POST NOTIFICATION with desire object here its "user"
[[NSNotificationCenter defaultCenter] postNotificationName:@"POSTLOGININFO" object:user];

//uncomment if you want this, ...depends on you 
//[self pushViewController:user.name andProfilePicture:_profilePicture];


现在更新 menuViewController.m、profileViewController.m 和 settingViewController.m 类的 init 方法,如下所示

-(id) init

  self = [super init];
  if (!self) 
   return nil;

  //Your custom code 

 //get registered for POSTLOGININFO notification so that selector method get called when you post notification with name POSTLOGININFO
  [[NSNotificationCenter defaultCenter] addObserver:self
      selector:@selector(gotLoginInfo:) 
          name:@"POSTLOGININFO"
              object:nil];
   return self;

将新方法 gotLoginInfo: 添加到每个 menuViewController.m、profileViewController.m 和 settingViewController.m

-(void)gotLoginInfo:(NSNotification *)notification

    //Assuming FBGraphUser class have all required properties
    FBGraphUser *user = (FBGraphUser *)[notification object];

   // save user.id and user.name to your class local variable
    NSLog(@"UserID::%@ and username::%@",user.id,user.name);



 -(void)dealloc

      [[NSNotificationCenter defaultCenter] removeObserver:self name:@"POSTLOGININFO" object:nil];


 

使用完成后删除通知观察者 "[[NSNotificationCenter defaultCenter] removeObserver:self name:@"POSTLOGININFO" object:nil];"。还要确保在 loginViewFetchedUserInfo 之前有你的类 menuViewController、profileViewController 和 settingViewController 的有效对象:被调用

【讨论】:

你能展示一个用这个实现的用户类的例子,所以我可以做到,一旦用户登录,我已经从我的 LoginViewController 调用 loginViewFetchUserInfo 那么我将如何传递该信息,我在想拥有一个 Facebook 类来使用和传递信息是否正常 对不起,用户类是错字,我已经更正了,其次你可以通过通知决定传递任何对象。 你说要删除 NSNotificationCenter 但我在 init 方法中用什么方法或.. 它继续说 FBGraphUser 未声明的类,但我已经导入了 FB SDK 当我们在 init 中添加通知时,我们需要在 dealloc 方法中删除通知【参考方案2】:

您可以使用 NSNotification。 例子 在 myClassA 中实现了一个名为 myTestNotificationReceived 的方法。现在我想从另一个类 myClassB 调用这个方法。下面是我如何使用 NSNotificationCenter 执行此操作的代码。

    @implementation myClassA
- (void) dealloc
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];

- (id) init

self = [super init];
if (!self) return nil;
[[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(myTestNotificationReceived:) 
    name:@"myTestNotification"
    object:nil];
return self;

- (void) myTestNotificationReceived:(NSNotification *) notification

if ([[notification name] isEqualToString:@"myTestNotification"])
    NSLog (@"Notification is successfully received!");

@end

现在我想从 myClassB 调用方法 myTestNotification。

@implementation myClassB
- (void) dealloc
[super dealloc];

- (id) init

    self = [super init];
    if (!self) return nil;
    return self;

- (void) myMethod

// All instances of myClassA will be notified
[[NSNotificationCenter defaultCenter] 
    postNotificationName:@"myTestNotification" 
    object:self];

@end

现在您可以在不同的类中添加尽可能多的观察者。

【讨论】:

我只是在这里尝试了您的示例,但没有任何反应。有没有更好、更深入的示例或教程,您可以向我展示如何一次将 facebook 信息传递给多个视图

以上是关于如何将 loginViewFetchedUserInfo: 中的信息一次传递给多个视图的主要内容,如果未能解决你的问题,请参考以下文章

如何将Ios文件上传到

Qt如何将文字变成图片?

如何将Bitmap保存为本地图片文件?

在MATLAB中如何将图导出

ASP如何将SQLSERVER数据导出到DBF(VF)

如何将CSV格式转换成JSON格式