2017-05-26 40 views
2

我想創建一個動態菜單,我發送文本和按鈕從一個控制器到下一個控制器的動作,然後我想生成按鈕運行該操作,但是我遇到了語法問題。如何調用一個func傳遞它作爲控制器之間的參數

,以便在第一控制器的示例我有:

let vc = storyboard.instantiateViewController(withIdentifier: 
     "CompetitiveKPIChart") as! CompetitiveKPIChartViewController 

    vc.Menu = [["Menu1":ClickBack()],["Menu2":ClickBack()],["Menu3":ClickBack()]] 

func ClickBack() { 
    self.dismiss(animated: true, completion: {}); 
} 

和在第二控制器:

var Menu : [Dictionary<String,()>] = [] 

override func viewDidLoad() { 
     let gesture2 = UITapGestureRecognizer(target: self,action: Menu["Menu1"]) 
    btnBack.addGestureRecognizer(gesture2) 
} 

如何可以調用從第一控制器的點擊返回()在第二控制器GestureRecognizer?

+0

難道你不能只是將第二個VC引用傳遞給第一個引用,然後在第一個引用上調用該方法? – NRitH

+0

這是行不通的,因爲第一種方法可能存在於情況1中,但不是情況2中。我的想法是將第二種視圖重用於不同的上下文。這意味着在情況1我們有行動1行動,但在情形2我們有不同名稱的行動2行動。 –

+0

你的代碼有幾個問題。 1)void函數應該是'() - >()',而不是'()'。 2)你的'Menu'是一個單元素字典的數組,但你指的就像是一本字典 - 我想你的意思是'menu:Dictionary ()>'3)第二個參數('action:')給你的手勢識別器初始化器需要是一個'Selector',它是一個'@ objc'方法,而不是Swift函數。我想我會放棄這一點,並建議你嘗試另一種方法! – Grimxn

回答

0

您的Menu聲明的語法是錯誤的 - 它應該是() ->()用於void函數,而不是()

這工作在遊樂場,你的語法不...

var menu : [Dictionary<String,() ->()>] = [] // Don't use capitals for variables... 

func aFunc() { 
    print("Hello aFunc") 
} 

menu = [["aFunc": aFunc]] 
menu.first!["aFunc"]!() // Prints "Hello aFunc" 

不過,我覺得這是你的代碼的第二個問題。您的線路

UITapGestureRecognizer(target: self,action: Menu["Menu1"])

不能編譯,作爲Menu是一個數組,而不是一個字典。我想你可能是指

var menu : Dictionary<String,() ->()> = [:] 

在這種情況下,你的設置代碼應該說

vc.menu = ["Menu1":ClickBack, "Menu2":ClickBack, "Menu3":ClickBack] 

然而,有一個最終的,而且很可能難以逾越的問題,這是你的代碼

override func viewDidLoad() { 
    let gesture2 = UITapGestureRecognizer(target: self, action: menu["Menu1"]) 
    btnBack.addGestureRecognizer(gesture2) 
} 

仍然會給出錯誤,因爲action:需要是Selector,這是一個@objc消息標識符,而不是Swift函數。

恐怕我看不出一個讓這個(相當聰明)的想法有效的好方法。重構的時間?

+0

感謝您的快速回答。有沒有辦法在gesturerecognizer中調用menu.first![「aFunc」]!()?因爲我需要在For循環中生成菜單按鈕 –

+0

代碼中有多個錯誤 - 更新了答案。 – Grimxn

+0

對不起,我想你忘了或者錯誤地寫了菜單類型var菜單:字典()> = [:]因爲我得到一個錯誤的行動:菜單[「Menu1」] –

相關問題