使用通知将 NSString 值从一个 ViewController 传递到另一个?
Pass NSString values from one ViewController to Another using Notifications?
如何使用 iOS 中的通知将 NSString 值从 ViewController1
传递到 ViewController2
?我试过:
ViewController1
- (void)viewDidLoad
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(incomingNotification:) name:@"test" object:nil];
}
- (void) incomingNotification:(NSNotification *)notification{
NSString *theString = [notification object];
NSLog(@"theString value=%@",theString);
}
ViewController2
- (void)viewDidLoad
{
NSString *myString=@"testing";
[[NSNotificationCenter defaultCenter] postNotificationName:@"test" object: myString];
}
我转到 ViewController2 时工作正常。
但我想使用这些通知将值从 ViewController1
发送到 ViewController2
。可能吗。怎么样?
我认为没有必要调用一个不可见的viewController来发送通知。您可以按以下方式传递您的值:
如果你使用storyboard,你可以在ViewController1的方法prepareForSegue
中得到ViewController2,所以你可以在这里传递你的引用。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
var targetViewController = segue.destinationViewController as UIViewController
}
如果您手动创建第二个 ViewController 并使用 presentViewController
,只需在初始化 ViewController2 时传递您的参考即可。
如果你坚持要用通知。将 view2 设置为通知发送者,将 view1 设置为另一个通知的接收者。
你得到一个 NSNotification 对象传递给你的函数。
将您的字符串或其他对象放入字典中
NSDictionary* userInfo = @{@"completionHandler" : completionHandler,
@"myStringIdentifier" : myString};
NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
[nc postNotificationName:@"myNotification" object:self userInfo:userInfo];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(receiveNotification:) name:@"UIKeyboardWillHideNotification" object:nil];
-(void) receiveNotification:(NSNotification*)notification
{
if ([notification.name isEqualToString:@"MyNotification"])
{
NSDictionary* userInfo = notification.userInfo;
... do dictionary stuff
}
}
这是在搜索 userinfo 和 NSNotification 以获取更多示例之前提出的问题
根据文档,是的,这是可能的。但是您应该先阅读文档(参见 NSNotificationCenter class reference)。
你应该看看的方法是
- (void)postNotificationName:(NSString *)notificationName
object:(id)notificationSender
userInfo:(NSDictionary *)userInfo
哪里
notificationName
是您想要post 的通知。 notificationSender
是要 post 通知的对象,userInfo
是您要随通知传递的信息。
因此,如果您想将通知从 ViewController2
传递到 ViewController1
(反之亦然)。
// ViewController1
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(incomingNotification:) name:@"myNotificationName" object:nil];
}
- (void) incomingNotification:(NSNotification *)notification {
NSDictionary *userInfo = notification.userInfo;
NSString *theString = userInfo[@"stringKey"]; // Here you retrieve the passed string from ViewController2 to ViewController1
NSLog(@"%@",theString);
}
// ViewController2
// Suppose you have an action set up for a specific button
- (IBAction)buttonTapped {
NSDictionary *userInfo = @{@"stringKey": @"stringPassed"};
[[NSNotificationCenter defaultCenter] postNotificationName:@"myNotificationName" object:self userInfo:userInfo];
}
在这里我要强调两个主要的事情。
- 两个控制器都应该是"valid"。换句话说,它们应该在内存中分配并呈现在某个地方。
- 添加观察者时,也应将其删除。
更新 1
在这种情况下,您将字符串从 UIViewController2
传递到 UIViewController1
。只需切换您正在使用的代码,您就可以将相同的字符串从 ViewController1
传递到 ViewController2
.
我的问题:你的目标是什么?
这会起作用...
在 ViewController 2
[[NSNotificationCenter defaultCenter] postNotificationName:@"test" object:self userInfo:@{@"stringValue": myString}];
在 ViewController 1
- (void)viewDidLoad
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(incomingNotification:) name:@"test" object:nil];
}
- (void) incomingNotification:(NSNotification *)notification{
NSString *theString = notification.userInfo[@"stringValue"] ;
NSLog(@"theString value=%@",theString);
}
您可以通过在 ViewController1 的按钮点击事件中初始化 ViewController2 来使用它。调用步骤,
1.Create ViewController2 中的方法(比如 notifRegister),它初始化通知以接收字典值。
2.On按钮点击事件初始化ViewController2并调用方法notifRegister
3.Then post ViewController1 中的通知。
示例:
- (IBAction)navigation:(id)sender {
ViewController1 *vc= [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"ViewController2"];
[vc notifRegister];
[self.navigationController pushViewController:(UIViewController*)vc animated:YES];
NSDictionary *name=[[NSDictionary alloc] initWithObjectsAndKeys:@"Tommy",@"name",nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"TextChanged" object:name];
}
在 ViewController2 上:
-(void)notifRegister
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadLabel:) name:@"TextChanged"object:nil];
}
-(void)reloadLabel:(NSNotification*)sender
{
NSLog(@"reload label called %@",sender.object);
self.labelName=[sender.object objectForKey:@"name"];
}
这里self.labelName是一个NSString对象...
如何使用 iOS 中的通知将 NSString 值从 ViewController1
传递到 ViewController2
?我试过:
ViewController1
- (void)viewDidLoad
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(incomingNotification:) name:@"test" object:nil];
}
- (void) incomingNotification:(NSNotification *)notification{
NSString *theString = [notification object];
NSLog(@"theString value=%@",theString);
}
ViewController2
- (void)viewDidLoad
{
NSString *myString=@"testing";
[[NSNotificationCenter defaultCenter] postNotificationName:@"test" object: myString];
}
我转到 ViewController2 时工作正常。
但我想使用这些通知将值从 ViewController1
发送到 ViewController2
。可能吗。怎么样?
我认为没有必要调用一个不可见的viewController来发送通知。您可以按以下方式传递您的值:
如果你使用storyboard,你可以在ViewController1的方法prepareForSegue
中得到ViewController2,所以你可以在这里传递你的引用。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
var targetViewController = segue.destinationViewController as UIViewController
}
如果您手动创建第二个 ViewController 并使用 presentViewController
,只需在初始化 ViewController2 时传递您的参考即可。
如果你坚持要用通知。将 view2 设置为通知发送者,将 view1 设置为另一个通知的接收者。
你得到一个 NSNotification 对象传递给你的函数。
将您的字符串或其他对象放入字典中
NSDictionary* userInfo = @{@"completionHandler" : completionHandler,
@"myStringIdentifier" : myString};
NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
[nc postNotificationName:@"myNotification" object:self userInfo:userInfo];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(receiveNotification:) name:@"UIKeyboardWillHideNotification" object:nil];
-(void) receiveNotification:(NSNotification*)notification
{
if ([notification.name isEqualToString:@"MyNotification"])
{
NSDictionary* userInfo = notification.userInfo;
... do dictionary stuff
}
}
这是在搜索 userinfo 和 NSNotification 以获取更多示例之前提出的问题
根据文档,是的,这是可能的。但是您应该先阅读文档(参见 NSNotificationCenter class reference)。
你应该看看的方法是
- (void)postNotificationName:(NSString *)notificationName
object:(id)notificationSender
userInfo:(NSDictionary *)userInfo
哪里
notificationName
是您想要post 的通知。 notificationSender
是要 post 通知的对象,userInfo
是您要随通知传递的信息。
因此,如果您想将通知从 ViewController2
传递到 ViewController1
(反之亦然)。
// ViewController1
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(incomingNotification:) name:@"myNotificationName" object:nil];
}
- (void) incomingNotification:(NSNotification *)notification {
NSDictionary *userInfo = notification.userInfo;
NSString *theString = userInfo[@"stringKey"]; // Here you retrieve the passed string from ViewController2 to ViewController1
NSLog(@"%@",theString);
}
// ViewController2
// Suppose you have an action set up for a specific button
- (IBAction)buttonTapped {
NSDictionary *userInfo = @{@"stringKey": @"stringPassed"};
[[NSNotificationCenter defaultCenter] postNotificationName:@"myNotificationName" object:self userInfo:userInfo];
}
在这里我要强调两个主要的事情。
- 两个控制器都应该是"valid"。换句话说,它们应该在内存中分配并呈现在某个地方。
- 添加观察者时,也应将其删除。
更新 1
在这种情况下,您将字符串从 UIViewController2
传递到 UIViewController1
。只需切换您正在使用的代码,您就可以将相同的字符串从 ViewController1
传递到 ViewController2
.
我的问题:你的目标是什么?
这会起作用...
在 ViewController 2
[[NSNotificationCenter defaultCenter] postNotificationName:@"test" object:self userInfo:@{@"stringValue": myString}];
在 ViewController 1
- (void)viewDidLoad
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(incomingNotification:) name:@"test" object:nil];
}
- (void) incomingNotification:(NSNotification *)notification{
NSString *theString = notification.userInfo[@"stringValue"] ;
NSLog(@"theString value=%@",theString);
}
您可以通过在 ViewController1 的按钮点击事件中初始化 ViewController2 来使用它。调用步骤, 1.Create ViewController2 中的方法(比如 notifRegister),它初始化通知以接收字典值。 2.On按钮点击事件初始化ViewController2并调用方法notifRegister 3.Then post ViewController1 中的通知。
示例:
- (IBAction)navigation:(id)sender {
ViewController1 *vc= [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"ViewController2"];
[vc notifRegister];
[self.navigationController pushViewController:(UIViewController*)vc animated:YES];
NSDictionary *name=[[NSDictionary alloc] initWithObjectsAndKeys:@"Tommy",@"name",nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"TextChanged" object:name];
}
在 ViewController2 上:
-(void)notifRegister
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadLabel:) name:@"TextChanged"object:nil];
}
-(void)reloadLabel:(NSNotification*)sender
{
NSLog(@"reload label called %@",sender.object);
self.labelName=[sender.object objectForKey:@"name"];
}
这里self.labelName是一个NSString对象...