如何将自定义 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];
    }];

    }