方法在DismissViewcontroller之后不刷新数据

时间:2014-05-08 12:33:25

标签: ios objective-c uitableview

我正在开发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}}

5 个答案:

答案 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)

  1. 您可以使用NSNotificationCenter解决问题。
  2. 在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
        }];
    
    }
    

    最后来自您实际尝试解除控制器使用代码的其他控制器