2017-04-06 73 views
8

我編程方式添加到UITapGestureRecognizer我的觀點一個選擇:參數傳遞到Swift3

let gesture = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(modelObj:myModelObj))) 

self.imageView.addGestureRecognizer(gesture) 

func handleTap(modelObj: Model) { 
    // Doing stuff with model object here 
} 

我遇到的是「的‘#selector’參數不是指一個「@Objc的第一個問題「方法,屬性,或初始化

酷,所以我加了@objc到handleTap簽名:

@objc func handleTap(modelObj: Model) { 
    // Doing stuff with model object here 
} 

現在我得到的錯誤「方法不能被標記@objc因爲TY參數pe不能在Objective-C中表示。

這只是一個建築物地圖的圖像,其中一些圖像指示了興趣點的位置。當用戶點擊其中一個引腳時,我想知道他們感興趣的哪個點,並且我有一個模型對象來描述這些興趣點。我使用這個模型對象在地圖上給出了它的座標,因此我認爲將對象發送到手勢處理程序會很容易。

+0

另一個功能時無法傳遞值那樣的選擇。爲什麼你不能將這個值保存在一個實例變量中並從選擇器方法訪問它? –

+4

http://stackoverflow.com/questions/35635595/sending-a-parameter-argument-to-function-through-uitapgesturerecognizer-selector可能的重複。 –

回答

20

它看起來像你誤會了幾件事。

當使用target/action,函數簽名必須具有一定的形式...

func doSomething(sender: Any) 

func doSomething(sender: Any, forEvent event: UIEvent) 

其中...

sender參數是控制對象發送行動訊息。

在你的情況下,發送的是UITapGestureRecognizer

此外,#selector()應包含FUNC簽名,並且不包括傳遞的參數。因此,對於...

func handleTap(sender: UIGestureRecognizer) { 

} 

你應該有......

let gesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(sender:))) 

假設FUNC和手勢是一個視圖控制器內,其中modelObj是一個屬性/伊娃,沒有必要與傳遞手勢識別器,你可以參考它在handleTap

1

我認爲你應該創建一個@objc方法,調用handleTap(modelObj:myModelObj)

@objc func someMethod() { // name this properly! 
    handleTap(modelObj: myModelObj) 
} 

然後你就可以通過這一個選擇:

#selector(someMethod) 
0

,而不是試圖直接調用handleTap這樣的:

#selector(self.handleTap(modelObj:myModelObj)) 

你可以創建一個函數,然後調用與參數

#selector(anyName) 

func anyName() { 
    let model = Model() 
    handleTap(modelObj: model) 
} 

func handleTap(modelObj: Model) { 
    // Doing stuff with model object here 
}