如何将 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: 中的信息一次传递给多个视图的主要内容,如果未能解决你的问题,请参考以下文章