我是iOS开发的新手,并试图弄清楚这里发生了什么。我有一个带有多个ViewControllers和类的标签栏应用程序。我的一个课程被调用并更新了工作正常的uilabels。然后调用另一个类,它也运行一个后台循环,用于更新同一个ViewController上的其他一些uilabel,它们用循环中的第一个条目更新一次,但是当循环在后台运行时不会。我可以看到循环仍在运行,细节正在改变,因为我使用NSLog记录输出。
ViewController也支持旋转,如果我旋转屏幕,循环中的数字然后被绘制到uilabel并固定,直到我再次旋转屏幕,即如果我将循环设置为5然后重置,取决于在旋转的地方,我旋转屏幕将取决于在uilabel中绘制1到5之间的数字。
在单个ViewController应用程序上运行正常,循环运行并且uilabels按预期更新。
更新uilabels的类从[super viewDidLoad]调用。
由于
以下是循环类: -
+ (void)Loop:(FirstViewController *)vc
{
NSLog(@"start");
static NSUInteger counter1 = 0;
NSLog(@"with count %d", counter1);
counter1++;
NSLog(@"count ++ %d", counter1);
NSString *label01 = [NSString stringWithFormat: @"%d", counter1];
//update uilabel
vc.cha01.text = label01;
if (counter1 >= 5) {
counter1 = 0;
}
// run loop with 1 second delay
[self performSelector:@selector(Loop:) withObject:nil afterDelay:1];
}
答案 0 :(得分:1)
你循环错误,首先你传递了viewController,但是当你调用performSelector:withObject:afterDelay:
时,你正在传递nil
。
因此vc
参数将为nil
,只需传递vc
参数:
// run loop with 1 second delay
[self performSelector:@selector(Loop:) withObject:vc afterDelay:1];
只是提示,您应该使用自定义对象来保存数据,然后在- (void)viewDidAppear:(BOOL)animated
中读取值并设置标签。
可以卸载UIViewController
以释放内存,这可能会导致代码出现问题。
只需使用MVC解决方案,这样一个模型可以保存数据,字符串。然后在de UIViewController
中设置标签,MVC的视图部分,MVC中的控制器。
<击>
加载视图后,永远不会再调用-(void)viewDidLoad
。这适用于UITabBarController
。
您应该将更新标签的代码移动到 - (void)viewDidAppear:(BOOL)animated
方法。