如何通过在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
。可能吗。怎么样?
答案 0 :(得分:1)
您可以通过在ViewController1的按钮单击事件中初始化ViewController2来使用它。步骤调用, 1.在ViewController2中创建方法(比如notifRegister),初始化通知以接收字典值。 2.在按钮上单击事件init ViewController2并调用方法notifRegister 3.然后在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对象......
答案 1 :(得分:0)
我认为没有必要调用不可见的viewController来发送通知。您可以按以下方式传递值:
如果你使用storyboard,你可以在ViewController1的方法prepareForSegue
中获取ViewController2,这样你就可以在这里传递你的参考。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
var targetViewController = segue.destinationViewController as UIViewController
}
如果手动创建第二个ViewController并使用presentViewController
,只需在初始化ViewController2时传递引用。
如果您坚持使用通知。将view2设置为通知发件人,将view1设置为带有其他通知的接收者。
答案 2 :(得分:0)
您获得了传递给您的函数的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之前已经提出的问题以获取更多示例
答案 3 :(得分:0)
根据文件,是的,这是可能的。但是你应该首先阅读文档(参见NSNotificationCenter class reference)。
你应该看的方法是
- (void)postNotificationName:(NSString *)notificationName
object:(id)notificationSender
userInfo:(NSDictionary *)userInfo
,其中
notificationName
是您要发布的通知。 notificationSender
是要发布通知的对象,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];
}
这里我要强调两个主要内容。
更新1
在这种情况下,您将字符串从UIViewController2
传递到UIViewController1
。只需切换您正在使用的代码,您就可以将同一个字符串从ViewController1
传递到ViewController2
。
我的问题:你的目标是什么?
答案 4 :(得分:0)
这将有效...
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);
}