2017-02-15 63 views
0

我的代碼在用戶觸摸表格視圖中的一行時以編程方式呈現視圖控制器。代碼駐留在「didSelectRowtIndex」路徑中,表視圖駐留在ViewController類中,在該類中實現了表視圖代表。我遇到的問題是我試圖呈現的視圖控制器只出現在表格視圖行的第二次觸摸上。但是,當父視圖控制器首次加載時,它們會在第一次觸摸時出現。下面是對兩個子視圖控制器的呈現在「didSelectRowAtIndexPath方法」的代碼:ViewController演示Swift 3

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    if indexPath.row == 0 { 

     let stockTable = StockTableVC() 
     self.present(stockTable, animated: false, completion: nil) 
    } 

    else indexPath.row == 1 { 

     let accountTable = AccountTableVC() 
     self.present(accountTable, animated: false, completion: nil) 
    } 

    ... 

兩個本視圖控制器方法以上被呼籲行選擇每一次,但somtimes沒有提出關於第一次選擇(或者至少它們不可見)。任何有關這個謎的幫助都會很棒。

-Thanks

回答

0

用我delay功能(記錄here):

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    if indexPath.row == 0 { 
     let stockTable = StockTableVC() 
     delay(0.1) { 
      self.present(stockTable, animated: false, completion: nil) 
     } 
    } 
    // ... and so on ... 
} 

這使選擇過程一次啓動演示文稿之前完成。

+0

有趣。謝謝,上面的取消選擇行解決方案很好,但如果我遇到問題,我會嘗試後者。 – jdeckman

+0

如果延遲超過0.1,該怎麼辦?該應用會崩潰。爲什麼大多數建議使用這個比取消選擇行? –

+1

@JuanCurti這不是關於時機;這是關於線程。因此,即使較短的延遲也能可靠地工作。我在這裏使用的技術是我們退出主線程並允許runloop完成,並在下一個runloop的主線程中返回。我們保證,我們在''didSelect'中的方法已經完成,整個調用堆棧將完成,因爲直到發生這種情況,我們將無法回到主線程。而在那個時候,只有在這一點上,我們可以安全地開始介紹。 – matt

1

您必須先取消選擇該行。在介紹前加入:

tableView.deselectRow(at: indexPath, animated: false) 

對我來說,這也是一種莫名的感覺。但是這幫助我在早些時候開始工作,我希望它也適用於您。

+0

哇,它的工作原理。非常感謝你!我認爲在早期版本的Swift中我沒有遇到這個問題,但我可能是錯的。 – jdeckman

+0

我不確定這是不是Swift 3的東西,但它發生在我身上很多次。將其標記爲正確,以便每個人都可以瞭解到此問題已修復此問題 –

+0

謝謝。我不得不通過StackOverflow如何標記爲正確。這不是很明顯。 – jdeckman

相關問題