2017-04-10 33 views
0

夫特3/iOS的10/Xcode的8按鈕明顯地點擊但事件不登記

我有一個視圖控制器(餅圖),它包含一個標籤,兩個按鈕和一個空的視圖(其中將包含一個餅圖)。標籤和兩個按鈕合併到水平堆棧視圖中,該視圖位於餅圖視圖上方。

當應用程序啓動時,上面的VC被嵌入到四個容器視圖中的一箇中(應用程序的主屏幕由這四個容器視圖組成)。

在pieChart中,我已將兩個按鈕連接到它們各自的IBActions和IBOutlets。當點擊按鈕2時,另一個VC會出現模態延續,但這種情況不會發生。顯然,該按鈕正在註冊點擊 - 即它點擊時會改變顏色。我已經在按鈕2的IBAction方法中放置了一個打印語句,但是這也不會顯示。控制檯中也不會顯示錯誤消息。

的唯一原因,發生這種情況,我已經幾個小時狩獵後發現的是:這樣的單擊事件信號通過按鈕傳遞到接收

  1. 子的觀點已經被添加到按鈕本身由添加的子視圖。這不適合我。訂單爲主應用程序窗口>容器視圖>嵌入式VC>堆棧視圖>按鈕。 InteractionEnabled被設置爲true。

  2. Button部分位於包含視圖的外部(它的高度/寬度可能大於其包含的視圖)。這不適合我。堆棧視圖,標籤和兩個按鈕共享相同的高度,並且堆棧視圖的寬度等於標籤和按鈕寬度以及標籤和按鈕之間的間距之和。

我也嘗試添加一個事件處理程序與:

SelectAnalyisButtonOutlet.addTarget(self, action: #selector(SelectAnalysisButtonClicked), for: .touchUpInside) 

,但相同的結果發生。

是否有任何其他原因似乎沒有註冊點擊事件?

EDIT 1

餅圖VC上述是換出相同的容器的視圖(稱爲detailContainerView)的若干VC的一個,這取決於哪個按鈕(所有這些都工作得很好)被點擊在其中一個容器視圖中(稱爲TabBar)。

我在兩個其他VC中的每一箇中放置了一個按鈕,它們在detailContainerView中顯示,並將它們分別鉤到IBAction上。每個IBAction都包含一個打印語句,當點擊該按鈕時觸發。此刻,這兩個VC只包含一個標籤和新插入的按鈕。當我運行應用程序時,沒有任何按鈕可用。

然後,我在屬性檢查器中將detailContainerView的一個VC設置爲初始視圖控制器,然後重新運行應用程序。突然之間按鈕現在工作!如果我把這些按鈕連接到一個segue,那麼這個segues也可以工作!

當我更換VC的detailContainerView時,某些東西似乎會改變。我使用的交換VC的出來的代碼如下:

func SwapOutControllers(vc: UIViewController, vcName: String){ 

    //REMOVE OLD VC 
    detailPaneVCReference?.willMove(toParentViewController: nil) 
    detailPaneVCReference?.view.removeFromSuperview() 
    detailPaneVCReference?.removeFromParentViewController() 

    var newVc: UIViewController? 

    switch vcName { 
    case "Biography": 
     newVc = vc as! Biography 

    case "Social Media": 
     newVc = vc as! SocialMedia 

    case "News Feed": 
     newVc = vc as! NewsFeeds 

    case "Stats": 
     newVc = vc as! StatsAboutParliament 

    case "Petitions": 
     newVc = vc as! Petitions 

    default: 
     print("Error: No VC Found!") 
    } 

    //ADD NEW VC 
    ParentVC?.addChildViewController(newVc!) 

    let width = detailContainerView?.frame.width 
    let height = detailContainerView?.frame.height 

    newVc?.view.frame = CGRect(x: 0, y: 0, width: width!, height: height!) 

    detailContainerView?.addSubview((newVc?.view)!) 

    newVc?.didMove(toParentViewController: ParentVC) 

} 

detailPaneVCReference是取其目前正由detailContainerView顯示VC的參考。 ParentVC是包含四個容器視圖的VC。

是從ParentVC去除VC在調試視圖層次依然存在後它已被刪除/換出 - 會這樣莫名其妙地到達事件處理程序阻止點擊事件?

解決方案!

我的問題的來源是,我已經對每個視圖控制器的交換進出detailContainerView的引用被錯誤地聲明爲弱引用。從每個聲明的,瞧!現在的代碼按預期工作: - :我已刪除的「弱」(例如「弱變種X的UIViewController?」>「的UIViewController變種X?」)!

回答

0

我的問題的根源一直是我不得不每一個進入和退出的detailContainerView交換了看法控制器所做的引用被錯誤宣佈爲弱引用。我從每個聲明中刪除了「weak」(例如「weak var x:UIViewController?」 - >「var x:UIViewController?」),代碼現在按預期工作!