只运行一次方法(启动时)?

时间:2012-06-26 04:26:27

标签: iphone ios cocoa methods

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

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

4 个答案:

答案 0 :(得分:5)

ViewDidLoad请使用此方法代替viewWillAppear

加载时会调用

ViewDidLoad,每次进入该视图时都会调用viewWillAppear

答案 1 :(得分:1)

ViewDidLoad将在每次加载视图时触发,每次会话可以多次触发(即释放视图的内存泄漏)。我要做的是创建一个布尔实例变量,并在init方法中将其设置为true。然后在显示警报视图之前检查此boolean var是否为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类中。

答案 2 :(得分:1)

我经常遇到类似的问题,所以我在我经常使用的包装器asround As Alinex-Async中添加了一个函数包装器。

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

在CoffeeScript伪代码中,它将被用作:

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

其他实现也可以使用第二次调用错误或多次返回但同时只返回一次错误。

答案 3 :(得分: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