使用popToRootViewController传递数据

时间:2014-05-28 03:30:57

标签: ios objective-c uistoryboardsegue rootview poptoviewcontroller

所以我有一个基本的应用程序,这是它的工作原理。我有一个名为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方法时可以做的更多。

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

你做的是正确的,但参数错误。通知帖子中的object:参数是发送对象。还有另一种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"]);
}

答案 1 :(得分:1)

使用委托:它会比NSNotification更好

tableView.h:

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

@interface tableView:UITableViewController //or something like this

@property(nonatomic,weak) id<tableViewDelegate> delegate;

tableView.m:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath     {
[self.delegate tableViewSelectRowWithString:@"your string"];
[self.navigationController popToRootViewControllerAnimated:YES];
}

-(void) dealloc{self.delegate = nil;}

// rootViewA.h

@interface rootViewA : UIViewController<tableViewDelegate>

// rootViewA.m

//When create tableView and push view:
tableView *t = ....;
tableView.delegate = self

-(void) tableViewSelectRowWithString:(NSString*)str{//use string}

答案 2 :(得分:0)

试试这可能会有所帮助

    MyAController *myController = (MyAController *)[self.navigationController.viewControllers objectAtIndex:0];
    myController.myText = @"My String" ;
    [self.navigationController popToViewController:myController animated:YES];

我已经使用了很多时间..它工作得很好.. 注意:在此替换您的类名和字符串。 谢谢:))