0

我有一个模态视图控制器和一个嵌入在普通视图控制器中的导航视图控制器。现在,当有人在我的导航栏上单击 UIBarButtonItem 时,他们会转到模态视图控制器。我有一个自定义 UIAlertView,它是一个用于检索我的应用程序数据的加载栏。我把它放在 ViewWillAppear 方法中。问题是如果有人进入模态视图控制器并返回导航控制器,UIAlertView 会再次弹出。有什么方法可以使方法仅在启动时发生?任何帮助,将不胜感激。谢谢!

这里有更多信息:我最初在 ViewDidLoad(而不是 ViewDidAppear)中拥有它,并且同样的事情不断出现。我有一种感觉,我可能在实现模态视图控制器时做错了。我有自己的自定义导航栏,所以我隐藏了正常的导航栏,并以编程方式调用 performSeguewithIdentifier。

4

4 回答 4

5

ViewDidLoad使用此方法代替viewWillAppear.

ViewDidLoad加载时调用一次,而viewWillAppear每次进入该视图时调用。

于 2012-06-26T04:33:26.870 回答
1

ViewDidLoad 将在每次视图加载时触发,每个会话可能不止一次(即释放视图的内存泄漏)。我要做的是创建一个布尔实例变量,并在您的 init 方法中将其设置为 true。然后在显示警报视图(来自 viewWillAppear 或 viewDidLoad)之前检查该布尔变量是否为真。

例如:

@interface YourViewController : UIViewController {
   BOOL showAlert;
}
@end

@implementation YourViewController
- (id) init {
   // initiate everything else and add this line
   showAlert = true;
   return self;
}

- (void) viewDidLoad {
   if(showAlert) {
      //UIAlertView... blah blah blah, show your view
      showAlert = false;
   }
}
@end

这可确保您的警报在每个会话中仅显示一次。除非出于某种原因,您的 ViewController 应该被释放。在这种情况下,您应该将此 BOOL 存储在 AppDelegate.h 类中。

于 2012-06-26T06:04:35.843 回答
1

我经常遇到类似的问题,所以我在我大量使用的包装器 arround Async 中添加了一个函数包装器,称为Alinex-Async

有了这个,我可以轻松地将任何函数定义为一个可以经常调用但只会运行一次的函数,并且所有进一步的调用都会返回相同的结果。如果在第一次运行时多次调用它,它也会正确响应。

在 CoffeeScript 伪代码中,它的用法如下:

async = require 'alinex-async'
fn = async.once (cb) ->
  result = do something
  cb null, result 

在第二次调用时出错或多次返回但同时只返回一次的替代实现也是可用的。

于 2015-08-02T20:17:17.390 回答
0

如果您使用 GCD,您可以尝试“dispatch_once”。

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    <#code to be executed once#>
});

https://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

于 2012-06-26T15:31:03.900 回答