【问题标题】:iOS TableView Reload after dismissing modal关闭模式后iOS TableView重新加载
【发布时间】:2014-08-24 00:13:26
【问题描述】:

在我的应用程序中,我在表格视图中列出核心数据条目。我想允许用户使用以模式显示为表单视图的详细视图来编辑记录。我在编辑记录时观察到异常行为。

流程:

  1. 用户加载带有记录的表格视图。 -工作
  2. 用户选择要编辑的记录。 -工作
  3. 用户在视图控制器中编辑记录,显示为模态表单视图。 -工作
  4. 用户保存编辑并关闭表单视图。 -工作
  5. Tableview 显示先前编辑的记录的正确更改。 -工作
  6. 用户重复步骤 2 - 4 选择要编辑的不同记录。 -工作
  7. Tableview 显示所有记录的正确数据。 - 不工作。

在第 7 步,tableview 将 第一个 已编辑记录的显示恢复到其原始状态。随后的记录编辑会导致所有先前的编辑恢复到其原始状态。如果 tableview 被关闭并重新加载,则记录是正确的,显示所有编辑。

我在 tableview 的 ViewWillAppear 方法中使用了 [tableview reload],但是当模态表单视图控制器被解除时,它似乎没有被触发。

在我的 tableviewcontroller 代码中:

-(void)viewWillAppear:(BOOL)animated
{
    [self.tableView reloadData];
}

四处搜索,我没有找到解决方案,希望有人能指出我正确的方向。

谢谢!

【问题讨论】:

  • 您的实现中应该有 [super viewWillAppear:animated]。我不知道它的缺失是否会导致 viewWillAppear 不被调用。当您关闭模式时,当然应该这样做。
  • 谢谢。我假设你会把它放在模态的解除方法中......它似乎不起作用。我猜可能需要为此设置一个委托方法......使用segue调用模态并且tableview当前不是模态的委托。
  • 不,它在 viewWillAppear 中。您应该始终在这些方法(viewDidLoad、viewDidAppear 等)中调用 super。
  • 所以,像这样:-(void)viewWillAppear:(BOOL)animated { [super ViewWillAppear:animated]; [self.tableView reloadData]; }
  • 是的,没错(除了大写的“V”)。

标签: ios core-data tableview modal-view


【解决方案1】:

当您呈现模态视图时,主视图控制器的视图永远不会消失。因此,在您关闭模态视图后,不会调用 viewWillAppear()。

您可以尝试在模态视图中实现自定义委托函数,并将其设置在主视图控制器中,当您的数据更新时,触发委托函数以重新加载您的主视图控制器中的 tableView。

了解什么是 iOS 中的委托功能,以及

如何创建一个委托函数是这样的:

  1. 在您的 ModalView.h 中:

    // define the protocol for the delegate
    @protocol ModelViewDelegate <NSObject> 
      - (void) didUpdateData;
    @end
    
    @interface ModalView: ViewController {
         //create a delegate instance
         id delegate;
    }
    
    // define delegate instance
    @property (nonatomic, assign) id <ModelViewDelegate> delegate;
    
  2. 在您的 modalView.m 中:

    @synthesize delegate;
    

    然后在你的函数中,将委​​托函数放在你需要触发的地方,例如:

    - (void) updateDataIntoDatabase{
           ....
           //Update work done.
    
           [self.delegate didUpdateData];
           //dismiss your modalView;
    }
    

所以,在你的 MainViewController.h 中,

#import ModalView.h

@interface ModalView: ViewController <ModelViewDelegate > {
      ...
}

在您的 MainViewController.m 中,您将收到一条警告,提示您需要实现已声明的委托函数。所以,设置委托功能,做你喜欢做的事:

- (void) didUpdateData{
    [self.tableView reloadData];
}

在您实例化 modalView 实例后,不要忘记将您的 modelView 委托设置为 self。如果不是,您的委托函数将不会被触发。

modalView.delegate = self;

【讨论】:

    【解决方案2】:

    触发模态视图控制器时使用完成块:

    -(void)editModal:(id)sender
    {
        KDSecondViewController *secondVC = [[KDSecondViewController alloc] init];
        [self presentViewController:secondVC animated:YES completion:^{
            //-- reload your table view when user dismiss the modal view
            [self.tableView reloadData];
        }];
    }
    

    【讨论】:

    • 这行不通。成功启动模式后将调用完成块,但在关闭时不会调用。
    猜你喜欢
    • 2020-03-25
    • 2017-11-14
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多