使用通知将 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];
}

在这里我要强调两个主要的事情。

  1. 两个控制器都应该是"valid"。换句话说,它们应该在内存中分配并呈现在某个地方。
  2. 添加观察者时,也应将其删除。

更新 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对象...