Ios 使用popToRootViewController传递数据

Ios 使用popToRootViewController传递数据,ios,objective-c,uistoryboardsegue,rootview,poptoviewcontroller,Ios,Objective C,Uistoryboardsegue,Rootview,Poptoviewcontroller,所以我有一个基本的应用程序,下面是它的工作原理。我有一个名为a的根视图控制器和一个名为B的表视图控制器。当用户选择B中的一行时,我会弹出到根视图控制器a 我试图做的是将被选为NSString的行的数据传递回根视图控制器a。然后使用这个字符串根据字符串“做一些事情” 我尝试过使用NSNotification方法,但无法使用字符串执行某些操作 以下是我尝试过的: //tableViewB.m -(void)tableView:(UITableView *)tableView didSelectRow

所以我有一个基本的应用程序,下面是它的工作原理。我有一个名为a的根视图控制器和一个名为B的表视图控制器。当用户选择B中的一行时,我会弹出到根视图控制器a

我试图做的是将被选为NSString的行的数据传递回根视图控制器a。然后使用这个字符串根据字符串“做一些事情”

我尝试过使用NSNotification方法,但无法使用字符串执行某些操作

以下是我尝试过的:

//tableViewB.m
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"passData" object:[[_objects objectAtIndex:indexPath.row] objectForKey:@"title"]];
    [self.navigationController popToRootViewControllerAnimated:YES];
}
//rootViewA.m
-(void)dataReceived:(NSNotification *)noti
{
     NSLog(@"dataReceived :%@", noti.object);

}
-(void)viewDidLoad {
  [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dataReceived:) name:@"passData" object:nil];
}
我想做的是,当您按下viewController并使用perpareForSegue方法时,您可以做的更多


提前感谢您的帮助。

您做的事情是正确的,但参数错误。通知帖子中的
对象:
参数是发送对象。还有另一个post方法允许调用方附加
userInfo:
,如下所示:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    // notice the prettier, modern notation
    NSString *string = _objects[indexPath.row][@"title"];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"passData"
                                                        object:self
                                                      userInfo:@{"theString" : string }]
    [self.navigationController popToRootViewControllerAnimated:YES];
}
在接收端,只需使用相同的键从通知的用户信息中获取数据:

-(void)dataReceived:(NSNotification *)notification {

     NSLog(@"dataReceived :%@", notification.userInfo[@"theString"]);
}

使用委托:这比通知要好

tableView.h:

@protocol tableViewDelegate
-(void) tableViewSelectRowWithString:(NSString*)str;
@end

@interface tableView:UITableViewController //or something like this

@property(nonatomic,weak) id<tableViewDelegate> delegate;
//rootViewA.h

@interface rootViewA : UIViewController<tableViewDelegate>

试试这个可能会有帮助

    MyAController *myController = (MyAController *)[self.navigationController.viewControllers objectAtIndex:0];
    myController.myText = @"My String" ;
    [self.navigationController popToViewController:myController animated:YES];
今年我用了很多时间。。它工作得很好。。 注意:替换此中的类名和字符串。
谢谢:)

好的,可以,但是我需要能够使用我在viewwilldisease方法中传递回A的字符串,我可以这样做。对吗?对。如果更新视图需要字符串,可以在dataReceived方法中执行。或者,如果您想将其保存到dataReceived中的view controller属性,您可以在此后的任何时间使用它,包括在该view controller的视图重新出现之前。除了发布的其他答案外,您还可以使用展开段返回,而不是popToRootViewController,这将允许您使用prepareForSegue,使用方式与前向序列相同。@rdelmar我如何在didSelectRowAtIndexPath方法中使用它?您可以像手动调用的任何其他序列一样使用它--为序列指定一个标识符,然后调用performSegueWithIdentifier:sender:。您也可以直接从单元格连接展开序列,在这种情况下,您根本不应该实现DidSelectRowatineXpath。@rdelmar所以您是说让一个推送序列从TableView B到根a,然后在DidSelectRowatineXpath方法中调用performsgueWithIdentifier:sender:?不,不是推送序列,而是展开序列。如果您是从控制器(B)连接它,那么您将在didSelectRowAtIndexPath方法中调用PerformsgueWithIdentifier:sender:,但是如果您直接从单元格连接segue,那么您不需要调用任何东西。当我将代码添加到tableView.h中时,我在代码上遇到了一系列错误。我只是把它贴在@intface行下面。是否有它需要去的特定位置?这可能适用于OP,但请注意ViewController数组是一个堆栈。通常,要使vc位于顶部以下,请使用navVC.viewControllers[MAX(0,navVC.viewControllers.length-2)]。长度为-1的是顶部,长度为0的是根。
//When create tableView and push view:
tableView *t = ....;
tableView.delegate = self

-(void) tableViewSelectRowWithString:(NSString*)str{//use string}
    MyAController *myController = (MyAController *)[self.navigationController.viewControllers objectAtIndex:0];
    myController.myText = @"My String" ;
    [self.navigationController popToViewController:myController animated:YES];