【问题标题】:Can't programmatically change UILabel text after viewWillAppear在 viewWillAppear 之后无法以编程方式更改 UILabel 文本
【发布时间】:2014-05-23 07:23:58
【问题描述】:

我的 iOS 程序中有一个从 Dropbox 导入和操作文件的例程。这可能需要一些时间(5-10 秒),并且在执行此操作时将用户返回到正常 UI 是没有意义的,因此我想呈现一个视图让用户知道进度。

从一个 VC,我使用 Dropbox 的插入式文件选择器,然后加载一个呈现的(模态 VC):

        ZSImportVC *importVC = [[ZSImportVC alloc] init];
        importVC.results = results;
        [importVC setModalPresentationStyle:UIModalPresentationFormSheet];
        [self presentViewController:importVC animated:YES completion:^{
            [self performFetch];
        }];

VC(一个沼泽标准的 UIViewController),有一个 UILabel 属性:

@property (weak, nonatomic) IBOutlet UILabel *statusMessage;

在 viewWillAppear 中:我可以毫无问题地设置这个标签的文本。问题是,随着文件操作过程的继续,我想继续更改此文本。

从viewDidAppear调用操作文件的方法:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self processImport];
}

但是,在 processImport 方法中,以下内容无效:

self.statusMessage.text = @"Some text to update the user.";

所以我创建了一个方法:

- (IBAction)updateStatus:(NSString *)message
{
    [self.statusMessage setText:message];
    NSLog(@"%@", message);
}

只是为了检查发生了什么。 NSLog 显示该方法调用正常,但标签文本没有改变。我尝试添加:

[self.statusMessage setNeedsDisplay];

到方法,但这没有帮助。我没有使用任何私有队列或后台线程。我在某处读到使用 NSNotification 有帮助,所以我尝试将其添加到 viewDidLoad:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateStatus:) name:@"updateStatus" object:nil];

然后把调用的方法改成:

- (void)updateStatus:(NSNotification *)message
{
    [self.statusMessage setText:message.object];
    NSLog(@"%@", message.object);
}

并从主方法调用它:

[[NSNotificationCenter defaultCenter] postNotificationName:@"updateStatus" object:@"Retrieving file from Dropbox" userInfo:nil];

我可以从控制台消息中看到正在调用 updateStatus 方法,但文本仍然没有改变。显然我在这里遗漏了一些东西。有什么想法吗?

【问题讨论】:

  • 检查从styoryboard 到您的UILabel 的链接。链接是否正确?
  • 你能添加更完整的代码吗?我想知道你从哪里添加Observer、postNotificationName等。那么我可以模拟我这边的过程。
  • 如果在设置文本的地方设置断点,po self.statusMessage 的输出是什么?另外,在这种情况下,它被调用的是什么线程? (在左侧导航器中)
  • HelmiB:我没有使用故事板。 UILabel 链接良好。我可以在 viewDidLoad 和 viewWillAppear 中设置它。之后的任何时候我都无法更改它......
  • 一切似乎都在线程 1 上运行。_statusMessage 属性正在更新,但其更改的值未显示在视图上。

标签: ios uilabel


【解决方案1】:

在 Debug 透视图中检查您的 ZSImportVC 实例。

我想你正在发送[self.statusMessage setText:message.object]; 到另一个实例,它没有显示在屏幕上。

我的意思是,

在这里放一个调试点:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self processImport];     /* Debug point here*/
}

并检查self 的十六进制方向。

现在,在这里做同样的事情:

- (void)updateStatus:(NSNotification *)message
{
    [self.statusMessage setText:message.object];  /* Debug point here*/
    NSLog(@"%@", message.object);
}

顺便说一句,我遇到了一些问题

 [[NSNotificationCenter defaultCenter] postNotificationName:@"updateStatus" object:@"Retrieving file from Dropbox" userInfo:nil];

因为收到此通知的实例不正确。

我修复了调用普通方法的问题,但你可能做不到。

对不起我的英语:S

【讨论】:

  • self 始终保持不变 - 例如: - 我也在其他几个地方检查过。
  • 试试这个:[self performSelectorOnMainThread:@selector(updateLabel:) withObject:yourString waitUntilDone:YES]; updateLabel 是一种正常的方法,而不是 IBAction。有了这个,你就强迫你在主线程上更新你的标签。否则我们可以尝试另一件事。
  • 试过了,但没有改变。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多