我正在开发iPhone应用程序,我一度陷入困境。
我面临的错误是,FirstViewController
点击了SecondViewController
SecondViewController
FirstViewController
FirstViewController
FirstViewController:
我有一个桌面视图我有一个按钮,点击该按钮我就是解雇我的presentViewController并再次回到- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
SecondViewController *Obj= [[SecondViewController alloc] init];
[self.navigationController presentViewController:Obj animated:YES completion:nil];
}
Code on SecondViewController:
我调用一个方法成功调用该方法,但它不执行该方法的内部任务,(意味着我想重新加载我的tableview它不会重新加载我的tableview,我想更改该页面的标题文本,但它不会更改)
这是我的代码段:
- (IBAction)ButtonClick:(id)sender {
FirstViewController *Obj=[[FirstViewController alloc] init];
[Obj MethodCall];
[self dismissViewControllerAnimated:YES completion:nil];
}
after dismissing SecondViewController, code on FirstViewController
-(void) MethodCall
{
NSLog(@" -- MethodCall Success --");
self.title=@"From back";
[tblView reloadData];
}
code on FirstViewController:
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tableReload) name:@"tableReload" object:nil];
}
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter]removeObserver:self name:@"tableReload" object:nil];
}
-(void)tableReload{
NSLog(@"-- FromSeeMore PushAndShowMerchants -- = %@",FromSeeMore);
[tblList reloadData];
}
code on SecondViewController :
我的日志显示 - MethodCall Success - 但它既不重新加载我的tableview也不更改FirstViewController的标题。
我在哪里做错了?
请帮助并感谢您阅读。
新编辑:
- (IBAction)SeemoreClick:(id)sender {
[[NSNotificationCenter defaultCenter] postNotificationName:@"tableReload" object:nil];
[self dismissViewControllerAnimated:YES completion:nil];
}
{{1}}
{{1}}
{{1}}
答案 0 :(得分:1)
首先,您应该遵循Objective-C
中的对象创建和方法声明 SecondViewController *Obj
它应该是SecondViewController * obj
-(void) MethodCall
它应该是-(void) methodCall
- (IBAction)ButtonClick:(id)sender
应为- (IBAction)ButtonClick:(id)sender
并且,您在MethodCall
中将您的方法FirstViewController
称为何处?
您是否尝试使用“委托”选项将数据发送到上一个视图控制器?
示例:
在FirstViewController.h
@protocol FirstControllerDelegate
-(void)dataUpdated:(NSArray *)array;
@end
@interface FirstViewController : UIViewController <FirstControllerDelegate>
@end
在FirstViewController.m
-(void)dataUpdated:(NSArray *)array
{
NSLog(@" -- MethodCall Success -- :%@", array);
self.title=@"From back";
[tblView reloadData];
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
SecondViewController *Obj= [[SecondViewController alloc] init];
Obj.delegate = self;
[self.navigationController presentViewController:Obj animated:YES completion:nil];
}
在SecondViewController.h
@property (nonatomic, assign) id <FirstControllerDelegate> delegate;
在SecondViewController.m
- (IBAction)ButtonClick:(id)sender
{
FirstViewController *Obj=[[FirstViewController alloc] init];
[_delegate dataUpdated:[NSArray arrayWithObject:@"Object Passed"]];
[self dismissViewControllerAnimated:YES completion:nil];
}
答案 1 :(得分:1)
试试这个: -
在 FirstViewController
中-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tableReload) name:@"tableReload" object:nil];
}
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter]removeObserver:self name:@"tableReload" object:nil];
}
-(void)tableReload{
self.tableView.delegate=self;
self.tableView.dataSource=self;
[self.tableView reloadData];
self.title=@"From back";
}
在 SecondViewController :
上- (IBAction)ButtonClick:(id)sender {
[[NSNotificationCenter defaultCenter] postNotificationName:@"tableReload" object:nil];
[self dismissViewControllerAnimated:YES completion:nil];
}
答案 2 :(得分:0)
@Natarajan - 这只是一个惯例。与所有约定一样,它们仅用于使代码更易于阅读和维护,对于其他将使用您的代码的人来说,.NET也采用ToString()作为约定。因此,如何命名方法并不重要......许多惯例都说你将类型的第一个字母(类,结构,枚举等)大写,否则使用小写(函数,成员等)但这不是问题。
@Krunal的问题是你在哪里调用MethodCall
,你确定在重新加载之前更改了表中的数据吗?你可以检查是否重新加载表,如果你说NSLog被调用,这意味着[tblView reloadData];
被调用,但它没有任何重新加载
答案 3 :(得分:0)
我有与@Ricky完全相同的想法,我从Modal窗口遇到同样的问题,从未调用的通知(所以我在网上寻找解决方案)所以你必须等待动画完成所以我有找到解决方案,我将把解决方案添加到他的代码中。
正如他所提到的,你必须在viewDidAppear中添加观察者并在viewWillDisappear中删除它,并且在你的第二个viewcontroller中你必须添加这个代码:
- (IBAction)ButtonClick:(id)sender {
[self dismissViewControllerAnimated:YES completion:^(void){
[[NSNotificationCenter defaultCenter] postNotificationName:@"tableReload" object:nil];
}];
}
执行此操作,它将在第一个viewcontroller中调用viewDidAppear,然后调用postNotificationName,以便调用方法tableReload。
关心和快乐的编码。
答案 4 :(得分:0)
NSNotificationCenter
解决问题。在MasterViewController viewDidLoad中定义NSNotification
,如下所示
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(closeModal:) name:@"CloseModal" object:nil];
然后定义方法如下
(void)closeModal:(NSNotification *)notification{
UIViewController *controller=(UIViewController *)notification.object;
[controller dismissViewControllerAnimated:YES completion:^ {
[self getPostData]; // Reload Data
[self.tableView reloadData]; // Reload Data
}];
}
最后来自您实际尝试解除控制器使用代码的其他控制器