2017-01-08 48 views
1

我在桌面上使用UIRefreshControl來更新項目。最後,我展示了一個UIAlertController來通知用戶更新已完成,並更新了多少項。非常簡單,一件事情可以正常工作。如果我連續刷新幾次,有時甚至在關閉警報後刷新控制也不會被解除。我需要向上滑動桌子才能消失。UIAlertController有時會阻止UIRefreshControl隱藏

這是我使用的代碼,所有UI的東西是很好做在主線程:

if(refreshControl.refreshing) { 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
      [self refreshItems]; 

      dispatch_async(dispatch_get_main_queue(), ^{ 
       [refreshControl endRefreshing]; 
       [self.tableView reload]; 
       [self showUpdateInfo];      
      }); 
     }); 
    } 

任何想法可能是什麼原因?

編輯:這是我在代碼中創建刷新控制(在viewDidLoad):

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; 
refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString: @"Checking for updates…"]; 
[refreshControl addTarget: self 
        action: @selector(refreshOutdatedItems) 
     forControlEvents: UIControlEventValueChanged]; 

self.refreshControl = refreshControl; 
+0

你在代碼中創建的UIRefreshControl或使用TableViewController財產? – Yan

+0

請參閱我的問題中的編輯。 – Koen

+0

我試圖重現該問題。您的代碼似乎按預期工作。順便說一句,你有dispach_sync,實際上墜毀在我身上。這是故意的還是應該是dispatch_async? – Yan

回答

-1

我相信它真的有與沒有的tableView滾動備份UIAlertController呈現前做。我試圖設置showUpdateInfo方法的延遲,似乎工作。我想當用戶只需要拉一次,它將需要半秒鐘來顯示UIAlertController檢查是否有幫助。 這裏是我的代碼

- (void)refreshOutdatedItems 
{ 
    NSLog(@"refresh"); 

    if (self.refreshControl.refreshing) { 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
      for (double i = 0 ; i < 100000000; i++){ 

      }; 

      dispatch_async(dispatch_get_main_queue(), ^{ 

       [self.refreshControl endRefreshing]; 
       [self performSelector:@selector(showUpdateInfo) withObject:nil afterDelay:0.5]; 

      }); 
     }); 
    } 
} 

讓我知道是否有幫助。

+0

太棒了!它的工作更加平滑(按我的口味),延遲時間更短(0.1秒)。 – Koen

+0

我把它放回0.5秒,在0.1秒時仍然發生。 – Koen

+0

我猜這取決於數據刷新完成後表格視圖有多遠。也許有一種方法可以檢測tableview何時結束動畫,但可能會更復雜一些。 – Yan

4

延遲任意時間不是一個很乾淨的解決方案。在我看來,通過計算兩倍到一千萬的數字來實現延遲也是一種破壞。

我最終什麼事做,而不是與此類似僞斯威夫特:

let alert = UIAlertController(...) 
present(alert, animated: true) { 
    refreshControl.endRefreshing() 
} 

它延緩調用endRefreshing(),直到提出警告。

我用斯威夫特3和實際代碼PromiseKit看上去更像是這樣的:

@IBAction func onRefresh() { 
    Repository.getNewData().then { data in 
     self.data = data 
     self.tableView.reloadData() 
    }.recover { error in 
     // Return a promise to make sure endRefreshing isn't called until the alert is presented. 
     return self.presentErrorAlert(message: "Some user-friendly message") 
    }.always { 
     self.refreshControl?.endRefreshing() 
    } 
} 

private func presentErrorAlert(message: String) -> Promise<Void> { 
    return Promise<Void> { fulfill, _ in 
     let alert = UIAlertController(title: "Error", message: message, preferredStyle: .alert) 
     alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) 
     self.present(alert, animated: true) { 
      fulfill() 
     } 
    } 
} 
+0

這應該是公認的答案 - 以任意數量推遲是一種破解。 –

0

只需重置內容表視圖的偏移:

- (void)endRefreshControl { 
    [self.tableView setContentOffset:CGPointMake(0, -self.refreshControl.bounds.size.height) animated:YES]; 
    [self.refreshControl endRefreshing]; 
} 

當任務完成後,調用[self endRefreshControl];
而比[self.refreshControl endRefreshing];

0

這似乎是Xcode中的一個bug。即使Johan Levin的解決方案有時似乎在Xcode 9.2中懸而未決。

這不完全是你要找的,但它是一個解決方法:不要使用UIAlertController。只需將您曾在UIAlertController到UIRefreshControl像這樣的文字:

refreshControl?.attributedTitle = NSAttributedString(string: "Pull to reload all reminders", attributes: [NSAttributedStringKey.foregroundColor: UIColor(red: 255.0/255.0, green: 182.0/255.0, blue: 8.0/255.0, alpha: 1.0)]) 
相關問題