所以我有一个基本的应用程序,这是它的工作原理。我有一个名为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方法时可以做的更多。
提前感谢您的帮助。
答案 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];
我已经使用了很多时间..它工作得很好.. 注意:在此替换您的类名和字符串。 谢谢:))