【发布时间】: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 属性正在更新,但其更改的值未显示在视图上。