Ios 当viewController第一次出现时运行一段代码
我正在使用parse从iOS应用程序中存储和检索数据。我的代码如下Ios 当viewController第一次出现时运行一段代码,ios,parsing,viewcontroller,viewdidload,Ios,Parsing,Viewcontroller,Viewdidload,我正在使用parse从iOS应用程序中存储和检索数据。我的代码如下 [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { if (!error) { for (PFObject *item in objects) { self.postPlace.text = [item objectForKey:@"place"]; }
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (!error) {
for (PFObject *item in objects) {
self.postPlace.text = [item objectForKey:@"place"];
}
}
else {
NSLog(@"Error: %@ %@", error, [error userInfo]);
}
}];
但是,在第一个视图中,我希望以下代码是:
self.postPlace.text = nil;
然后剩下的时间:
self.postPlace.text = [item objectForKey:@"place"];
我如何实现这一点?我已经查看了viewDidLoad和ViewDidDisplay,但我有点卡住了。我建议您使用
静态BOOL
标志来完成此任务
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (!error) {
for (PFObject *item in objects) {
static BOOL flag = YES;
if (flag) {
self.postPlace.text = nil;
} else {
self.postPlace.text = [item objectForKey:@"place"];
flag = NO;
}
}
}
else {
NSLog(@"Error: %@ %@", error, [error userInfo]);
}
}];
这样做: 声明一个BOOL类型的实例变量,让我们调用它
isFirst
在您的视图中,加载makeisFirst=FALSE代码>。然后在您的视图中执行此操作将出现
(请记住viewdiload
仅在第一次调用时才被调用。但是viewdiload
每次进入此viewController
时都会被调用。因此,请相应地规划您的代码。)
希望这有帮助……:) 由于我已经与其他两个(在撰写本文时)答案的作者就他们建议使用的静态
局部变量进行了长时间的讨论,我将提供我自己的答案,以及我认为更好的解决方案
如果每个进程只能有一个static
局部变量的实例,那么使用static
局部变量来跟踪某件事情是否已经完成,会将类的实例数限制为一个。对于视图控制器来说,这可能不是一个问题,因为可能只需要一个实例,但是,在很多情况下,视图控制器的多个实例将被使用,并且使用静态
局部变量将在以后的开发中导致一个难以发现的错误,特别是因为它非常不明显
我的建议是使用一个实例变量跟踪您的行为,允许类的多个实例,并使您明显地这样做,正如类@interface
中显示的那样,大声说出它的用途(如果命名正确)
因此:
@interface MyViewController : UIViewController
{
BOOL _haveSetPostPlaceNil;
}
在代码中(无需将其初始化为no
,除非您确实感觉需要),使用:
为什么static
而不是实例变量?这限制了这个类的实例数量。你能解释一下吗?这对我很有帮助。每个进程只能有一个静态
变量的实例,因此使用一个实例可以限制一个类的实例数(一个)。改为使用实例变量,然后您可以拥有任意多个此类实例。@特洛伊敌人,谢谢,顺便说一句,我的全局变量是指所有方法都可以访问的类变量。再说一次,我认为根本不需要全局/类/静态作用域变量。实例变量是简单/明显/自记录的。为什么是静态变量而不是实例变量?这限制了您可以拥有此类实例的数量。@特洛伊木马,因为该视图将出现多次。而OP只想在第一次做点什么。因此,需要静态。另一种方法是创建实例变量。但是我认为静态变量就足够了。@trojanfoe这限制了这个类的实例数量。
你能解释更多吗?使用静态是不好的做法,因为有一天当你忘记它时,它会给你带来一个丑陋的bug。另一个答案请参见我留下的评论。感谢您指出使用static
变量时可能出现的错误。
@interface MyViewController : UIViewController
{
BOOL _haveSetPostPlaceNil;
}
for (PFObject *item in objects) {
if (!_haveSetPostPlaceNil) {
self.postPlace.text = nil;
_haveSetPostPlaceNil = YES;
} else {
self.postPlace.text = [item objectForKey:@"place"];
}
}