使用通知将NSString值从一个ViewController传递给另一个ViewController?

时间:2015-02-12 13:05:53

标签: ios nsnotificationcenter nsnotification

如何通过在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。可能吗。怎么样?

5 个答案:

答案 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. 两个控制器应该是"有效"。换句话说,它们应该在内存中分配并呈现在某个地方。
  2. 添加观察者时,您也应将其删除。
  3. 更新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);
}