【问题标题】:Can I invoke the delegate method after popViewcontroller?我可以在 popViewcontroller 之后调用委托方法吗?
【发布时间】:2014-07-15 09:41:49
【问题描述】:

1) 我有两个控制器,fistViewController,secondViewController。

2) 第一个控制器实现委托说“xyzDelegate”。

@interface FirstViewController : UIViewController <xyzDelegate>

3) First View Controller 中的委托方法刷新 UIViewTable。

4) 第一个控制器:推送第二个视图控制器。

 SecondviewController *svc = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
 svc.delegate = self;

[self.navigationController pushViewController:svc animated:YES];

4) 在第二个视图控制器中:

 id<xyzDelegate> strongDelegate = self.delegate; 

[self.navigationController popViewControllerAnimated:YES];
NSLog (@"After popViewControler");

[strongDelegate dateSelected:dateChoosen];  // Invoking Delegate Method.

问题:

1) 在弹出视图控制器之后调用委托方法是否是普遍做法? 当我在刷新 UITable 时,一旦在 FirstView 控制器中调用了委托方法。

【问题讨论】:

  • 为什么不选择日期?或者只是在第一个视图控制器viewWillAppear:时刷新表格?

标签: ios uiviewcontroller delegates


【解决方案1】:

通常,视图控制器是一个独立的屏幕单元。特别是如果它是由导航控制器切换的。您应该重新配置视图以在 viewWillAppear:viewDidAppear: 方法的覆盖之一中绑定其数据。

通常首选viewDidAppear:。因为在很多情况下,切换视图需要重新加载底层数据,而这通常会导致异步 I/O。在这种情况下,这种异步 I/O 可能会干扰同时执行视图切换动画。

无论如何,如果您的视图设置操作是轻量级的,那么最好使用viewWillAppear:,因为它会让您的用户等待更少。

在这种情况下,IMO,您最好的选择似乎只是标记刷新目标视图控制器上的数据,并在视图控制器的 viewDidAppear: 方法中处理刷新。

【讨论】:

  • 谢谢,完美!! :)
【解决方案2】:

您应该在 POP 操作发生之前调用委托方法。

    [strongDelegate dateSelected:dateChoosen]; 

popViewControllerAnimated 会调用第二个视图控制器的 dealloc 方法来销毁,在这里你会释放 strongDelegate。所以没有更多的 strongDelegate 来接收 dateSelected: 方法。

   [self.navigationController popViewControllerAnimated:YES];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多