如何将自定义 UIView 添加为加载屏幕
How to add a custom UIView as a loading screen
我已尝试在本网站上搜索和检查许多问题,但仍找不到我的问题的答案。也许有一些类似的问题可以解决我的问题,但我没有足够的经验了解这方面的知识,请见谅。
我正在开发一个使用 CloudKit 来存储用户数据的应用程序。所以一开始,当用户访问我的视图时,我尝试通过以下方法获取他们的用户 ID:
- (void)initCloudKit{
_container = [CKContainer defaultContainer];
_publicData = [_container publicCloudDatabase];
BOOL __block finished = false;
// get UserID and pass to self.userID
self.userID = [NSString stringWithFormat:@""];
[self.container fetchUserRecordIDWithCompletionHandler:^(CKRecordID *recordID, NSError *error) {
if (error== nil) {
NSLog(@"USER ID: %@", recordID.recordName);
self.userID = [NSString stringWithFormat:@"%@", recordID.recordName];
finished = true;
}else{
NSLog(@"An error occured in %@: %@", NSStringFromSelector(_cmd), error);
}
}];
while (!finished) {
// NSLog(@"loading....");
[self showLoadingScreen];
}
}
一切正常,如您所见,如果用户 ID 尚未返回,我将通过 NSLog 显示 "loading ..."。但现在我想向用户展示一个加载屏幕,而不是向我自己展示这个日志。
我有一个名为 showLoadingScreen
的方法可以在加载期间添加自定义 UIView,但它会在一切完成后显示。
注意:我将此方法放在 ViewDidLoad()
中,但不知何故在启动屏幕上打印了日志 ("loading...") ??
我的期望是:
1 - 出现启动图像的启动应用程序。
2 - 我的主要观点是出现。
3 - 在我请求用户 ID 期间,加载屏幕将添加到我的主视图。
4 - 当我有用户 ID 时加载屏幕消失了(这很容易,所以我没有包含在下面的代码中)
请帮助我,我的问题可能很愚蠢,但我是新手,还有很多东西要学,所以请随时问我任何与此相关的问题。
非常感谢!
我想你需要在这个 while 语句之前做一次,所以你的代码可能如下所示
- (void)initCloudKit{
_container = [CKContainer defaultContainer];
_publicData = [_container publicCloudDatabase];
BOOL __block finished = false;
// get UserID and pass to self.userID
self.userID = [NSString stringWithFormat:@""];
[self.container fetchUserRecordIDWithCompletionHandler:^(CKRecordID *recordID, NSError *error) {
if (error== nil) {
NSLog(@"USER ID: %@", recordID.recordName);
self.userID = [NSString stringWithFormat:@"%@", recordID.recordName];
finished = true;
}else{
NSLog(@"An error occured in %@: %@", NSStringFromSelector(_cmd), error);
}
}];
[self showLoadingScreen];
while (!finished) {
// NSLog(@"loading....");
}
}
尝试在请求用户ID时使用GCD(Grand Central Dispatch)加载LoadingView。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//loading the View
});
您不必使用 while 循环,它会影响性能。
只需要加载开始时showLoading,加载结束时隐藏即可。
我有建议给你:
- (void)initCloudKit{
_container = [CKContainer defaultContainer];
_publicData = [_container publicCloudDatabase];
BOOL __block finished = false;
// get UserID and pass to self.userID
[self showLoadingScreen];
self.userID = [NSString stringWithFormat:@""];
[self.container fetchUserRecordIDWithCompletionHandler:^(CKRecordID *recordID, NSError *error) {
if (error== nil) {
NSLog(@"USER ID: %@", recordID.recordName);
self.userID = [NSString stringWithFormat:@"%@", recordID.recordName];
}else{
NSLog(@"An error occured in %@: %@", NSStringFromSelector(_cmd), error);
}
// After done, we'll hide loading screen.
[self hideLoadingScreen];
}];
}
我已尝试在本网站上搜索和检查许多问题,但仍找不到我的问题的答案。也许有一些类似的问题可以解决我的问题,但我没有足够的经验了解这方面的知识,请见谅。
我正在开发一个使用 CloudKit 来存储用户数据的应用程序。所以一开始,当用户访问我的视图时,我尝试通过以下方法获取他们的用户 ID:
- (void)initCloudKit{
_container = [CKContainer defaultContainer];
_publicData = [_container publicCloudDatabase];
BOOL __block finished = false;
// get UserID and pass to self.userID
self.userID = [NSString stringWithFormat:@""];
[self.container fetchUserRecordIDWithCompletionHandler:^(CKRecordID *recordID, NSError *error) {
if (error== nil) {
NSLog(@"USER ID: %@", recordID.recordName);
self.userID = [NSString stringWithFormat:@"%@", recordID.recordName];
finished = true;
}else{
NSLog(@"An error occured in %@: %@", NSStringFromSelector(_cmd), error);
}
}];
while (!finished) {
// NSLog(@"loading....");
[self showLoadingScreen];
}
}
一切正常,如您所见,如果用户 ID 尚未返回,我将通过 NSLog 显示 "loading ..."。但现在我想向用户展示一个加载屏幕,而不是向我自己展示这个日志。
我有一个名为 showLoadingScreen
的方法可以在加载期间添加自定义 UIView,但它会在一切完成后显示。
注意:我将此方法放在 ViewDidLoad()
中,但不知何故在启动屏幕上打印了日志 ("loading...") ??
我的期望是: 1 - 出现启动图像的启动应用程序。 2 - 我的主要观点是出现。 3 - 在我请求用户 ID 期间,加载屏幕将添加到我的主视图。 4 - 当我有用户 ID 时加载屏幕消失了(这很容易,所以我没有包含在下面的代码中)
请帮助我,我的问题可能很愚蠢,但我是新手,还有很多东西要学,所以请随时问我任何与此相关的问题。 非常感谢!
我想你需要在这个 while 语句之前做一次,所以你的代码可能如下所示
- (void)initCloudKit{
_container = [CKContainer defaultContainer];
_publicData = [_container publicCloudDatabase];
BOOL __block finished = false;
// get UserID and pass to self.userID
self.userID = [NSString stringWithFormat:@""];
[self.container fetchUserRecordIDWithCompletionHandler:^(CKRecordID *recordID, NSError *error) {
if (error== nil) {
NSLog(@"USER ID: %@", recordID.recordName);
self.userID = [NSString stringWithFormat:@"%@", recordID.recordName];
finished = true;
}else{
NSLog(@"An error occured in %@: %@", NSStringFromSelector(_cmd), error);
}
}];
[self showLoadingScreen];
while (!finished) {
// NSLog(@"loading....");
}
}
尝试在请求用户ID时使用GCD(Grand Central Dispatch)加载LoadingView。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//loading the View
});
您不必使用 while 循环,它会影响性能。
只需要加载开始时showLoading,加载结束时隐藏即可。
我有建议给你:
- (void)initCloudKit{
_container = [CKContainer defaultContainer];
_publicData = [_container publicCloudDatabase];
BOOL __block finished = false;
// get UserID and pass to self.userID
[self showLoadingScreen];
self.userID = [NSString stringWithFormat:@""];
[self.container fetchUserRecordIDWithCompletionHandler:^(CKRecordID *recordID, NSError *error) {
if (error== nil) {
NSLog(@"USER ID: %@", recordID.recordName);
self.userID = [NSString stringWithFormat:@"%@", recordID.recordName];
}else{
NSLog(@"An error occured in %@: %@", NSStringFromSelector(_cmd), error);
}
// After done, we'll hide loading screen.
[self hideLoadingScreen];
}];
}