【问题标题】:How to make viewDidAppear load after view appears in iOS?如何在 iOS 中出现视图后加载 viewDidAppear?
【发布时间】:2016-08-11 09:42:14
【问题描述】:

我正在尝试获取一个标签以从 URL 加载文本,以便可以在不更新实际应用的情况下从服务器更新它。

最初我使用 viewDidLoad 方法,但是这加载视图太慢了。我读到使用 viewDidAppear 方法,但是,它以相同的方式加载。我试图找到详细说明如何使其工作的论坛,但找不到我需要的东西。

我也读过关于异步加载的文章,虽然我是编码新手,所以我真的不知道我在读什么!

如果有人能告诉我在这种情况下如何解决这个问题,那就太好了。

谢谢。

- (void)viewDidLoad {
    [super viewDidLoad];

    // Do any additional setup after loading the view.
}

-(void) viewDidAppear:(BOOL)animated {
    NSURL *urlTermOutlookTitle = [NSURL URLWithString:@"URL that info is coming from here"];
    NSString *TitleLabel = [NSString stringWithContentsOfURL:urlTermOutlookTitle encoding:NSStringEncodingConversionAllowLossy error:nil];
    TermOutlookTitleLabel.text = TitleLabel;
}

【问题讨论】:

  • 只需在 viewDidLoad() 或 viewWillAppear() 方法中写入第一行 viewDidAppear(true)。
  • 你想要什么?从服务器响应中异步更新可用文本?
  • @SMi - 是的,我只是没有找到一个教程或搜索信息,以我可以理解的方式解释异步加载信息,或者如果可以的话,它是一个非常不同的功能。
  • 您的信息类型是什么? Json 还是什么?

标签: ios xcode viewdidappear


【解决方案1】:

永远不要在主线程上调用网络请求和任何非即时的东西,因为它会冻结你的应用程序。 查看this answer 并将其用于网络请求而不是stringWithContentsOfURL

可能很慢,因为网络请求需要时间。在打开视图控制器之前尝试下载文本。如果这是您的初始视图控制器,请在 App Delegate 中执行。

另外,当调用viewDidAppear 时,你必须调用super。

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

    // Your code...
}

viewDidLoad 只会在您的应用启动时运行一次,每次您的视图出现在屏幕上时都会调用viewDidAppear

【讨论】:

    【解决方案2】:

    调用 [super viewDidAppear:animated]; 如果你只想在标签中显示url字符串

    -(void) viewDidAppear:(BOOL)animated {
        [super viewDidAppear:animated];
    
        NSURL *urlTermOutlookTitle = [NSURL URLWithString:@"URL that info is coming from here"];
        NSString *TitleLabel = [NSString stringWithContentsOfURL:urlTermOutlookTitle encoding:NSStringEncodingConversionAllowLossy error:nil];
         dispatch_async(dispatch_get_main_queue(), ^{
               TermOutlookTitleLabel.text = TitleLabel;
            }); 
    

    }

    您也可以随时直接从任何其他方法调用委托方法。

    [self viewDidAppear:YES]
    

    如果你必须从服务器中提取数据

    NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"URL that info is coming from here"]];
    [NSURLConnection sendAsynchronousRequest:request
                                       queue:[NSOperationQueue mainQueue]
                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
        // optionally update the UI to say 'done'
        if (!error) {
            NSDictionary *json = [NSJSONSerialization JSONObjectWithData: requestHandler options: NSJSONReadingMutableContainers error: &e];
            // update the UI here (and only here to the extent it depends on the json)
            dispatch_async(dispatch_get_main_queue(), ^{
               TermOutlookTitleLabel.text = TitleLabel;
            });  
        } else {
            // update the UI to indicate error
        }
    }];
    

    【讨论】:

    • 甜蜜。这样就可以加载视图,而不仅仅是在标签中显示占位符文本,但它没有从 URL 加载信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    相关资源
    最近更新 更多