簡體   English   中英

以編程方式關閉視圖控制器時的警告

[英]Warning when dismissing view controller programatically

我有一個帶按鈕的TableViewController ,該按鈕觸發[NSURLConnection sendAsynchronousRequest...]事件,並且還通過performSegueWithIdentifier:sender:加載了一個模式segue,它針對一個小型視圖控制器。 此疊加視圖控制器的目的是顯示加載圖形,並防止通過NSURLConnection發送數據時的用戶交互。

NSURLConnection的完成塊中,我調用一個方法,該方法刪除TableViewController中的數據(它只是一個批處理列表),然后在覆蓋視圖控制器上調用dismissViewControllerAnimated:completion:

除關閉疊加視圖控制器外,其他所有操作都有效,它會在調試器中引發警告: “警告:在進行演示或關閉時嘗試從視圖控制器中關閉!”

我發現了有關此錯誤的各種問題和答案,特別是有關使用performSelector:object:withDelay方法的問題和答案,但到目前為止沒有任何效果。

這特別令人討厭,因為我在應用程序的另一個區域中使用了類似的過程,只是從選擇UITableViewCell調用dismissViewController,並且工作正常……

我的代碼的相關位如下所示:

#import "ViewBatch.h"

@interface ViewBatch ()
@property (strong, nonatomic) LoadingOverlayViewController *loadingOverlay;
@end

@implementation ViewBatch
@synthesize loadingOverlay;

....

- (IBAction)exportBatch:(id)sender
{
    if ([productArray count] > 0) {
        [self performSegueWithIdentifier:@"loadingSegue" sender:self];
        [self processData];
    }
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"loadingSegue"]) {

        loadingOverlay = segue.destinationViewController;
    }
}

- (void)processData
{

    // Code to create a file and NSURLRequest...
    // ....

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [NSURLConnection sendAsynchronousRequest:urlRequest
                                       queue:queue
                           completionHandler:^(NSURLResponse *response, NSData *responseData, NSError *error) {
                               if ([responseData length] > 0 && error == nil)
                               {
                                   // Not used for this request yet...
                               }
                               else if ([responseData length] == 0 && error == nil)
                               {
                                   // Success...
                                   [self didSendData];
                               }
                               else if (error != nil)
                               {
                                   // Connection error...
                                   NSLog(@"Error: %@", error);
                               }
                          }];
}

- (void)didSendData
{
    // Reset the batch...

    [productArray removeAllObjects];
    [self.tableView reloadData];

    [loadingOverlay dismissViewControllerAnimated:YES completion:NULL];
}

加載視圖控制器就是:

#import <UIKit/UIKit.h>

@interface LoadingOverlayViewController : UIViewController

@property (weak, nonatomic) IBOutlet UILabel *statusLabel;
@property (weak, nonatomic) IBOutlet UIActivityIndicatorView *activityIndicator;

@end

....

....

#import "LoadingOverlayViewController.h"

@interface LoadingOverlayViewController ()
@end

@implementation LoadingOverlayViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.activityIndicator startAnimating];
}

@end

我不確定問題的確切原因,但是這里有一些關於您的代碼的觀察。

  • 您不需要覆蓋即可防止用戶交互。 只需使用-NSApplication beginIgnoringInteractionEvents關閉用戶交互即可。

  • 您不需要整個視圖控制器即可顯示疊加視圖。 只是顯示視圖。 例如,當發生NSURLConnection時,我經常在視圖的中間放置一個較大的UIActivityIndi​​catorView。

  • 您不需要NSOperationQueue即可異步使用NSURLConnection。 它已經是異步的。 只需創建NSURLConnection並等待委托消息到達即可。 實際上,您正在忙碌,因為您要設置輔助隊列,消息到達該隊列,然后調用didSendData ,后者在表上調用reloadData在后台,這是非法的。 如果以常規方式執行此操作,則委托消息將到達您想要的主線程上。

沒關系,我知道了。 半個小時的休息可以使人們的思想井井有條...

該過程正在完成,並在實際視圖甚至尚未完成加載之前調用dismissViewController。 從疊加層上的viewDidLoad進行的簡單委托調用將事情分類。

我也有這個問題。 我注意到這是由於在我的筆尖文件中復制並粘貼了一個按鈕而導致的。 這樣的結果是我不得不將IBActions綁定到兩個1 UIButton。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM