0

我是 iOS 开发的新手,并试图弄清楚这里发生了什么。我有一个带有多个 ViewController 和类的选项卡栏应用程序。我的一个课程被调用并更新了运行良好的 uilabels。然后调用另一个类,它也运行一个后台循环,该循环旨在更新同一 ViewController 上的一些其他 uilabels,它们会使用循环中的第一个条目更新一次,但不会在循环保持在后台运行时更新。我可以看到循环仍在运行,并且在我使用 NSLog 记录输出时细节正在发生变化。

ViewController 还支持旋转,如果我旋转屏幕,则循环中的数字将被绘制到 uilabel 并固定,直到我再次旋转屏幕,即如果我将循环设置为 5 然后重置,具体取决于在循环我旋转屏幕将取决于 1 到 5 之间的哪个数字被绘制到 uilabel。

在单个 ViewController 应用程序上运行良好,循环运行并且 uilabels 按预期实时更新。

从 [super viewDidLoad] 调用更新 uilabels 的类。

谢谢

这是带有循环的类:-

 + (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];

    }
4

1 回答 1

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读出值并设置标签。AUIViewController可以卸载以释放内存,这可能会导致您的代码出现问题。

只需使用 MVC 解决方案,从而在您的案例中保存数据和字符串的模型。然后在 de 中设置标签,MVC 的视图部分,MVC 中UIViewController的控制器。


加载视图后,将-(void)viewDidLoad不再调用。这适用于您在UITabBarController.

您应该将更新标签的代码移动到- (void)viewDidAppear:(BOOL)animated方法中。

于 2013-04-09T15:03:01.207 回答