2016-08-08 12 views
36

Tôi đang cố gắng thêm UITapGesture vào UIButton để nó sẽ kích hoạt chức năng khi nhấn vào. Tôi đang sử dụng Swift 3 và là nhận được một số lỗi:Swift3 iOS - Cách làm cho chức năng kích hoạt UITapGestureRecognizer

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[SwiftRunner.ViewController tapBlurButton]: unrecognized selector sent to instance 0x149e07610'

Đây là khoảng những gì tôi có:

// Swift 3 
import UIKit 
class ViewController { 

    @IBOutlet weak var qsBlurButton: UIButton!  

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let tapGesture = UITapGestureRecognizer(target: self, action: Selector(("tapBlurButton"))) 
     qsBlurButton.addGestureRecognizer(tapGesture) 
    } 

    func tapBlurButton(sender: UITapGestureRecognizer) { 
     print("Please Help!") 
    } 
} 
+0

nếu bạn muốn kích hoạt chức năng bằng UIButton thì bạn cũng có thể sử dụng qsBlurButton.addTarget (đích: tự, hành động: ": FuncName", forControlEvents: TouchUpInside) –

Trả lời

96

Từ mã của bạn bạn đang sử dụng nhanh chóng 3.0 để thay đổi cú pháp selector bạn như thế này

let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.tapBlurButton(_:))) 

và chức năng của bạn như thế này

func tapBlurButton(_ sender: UITapGestureRecognizer) { 
    print("Please Help!") 
} 

Edit:

Không tưởng rằng bạn đang sử dụng nút với vòi cử chỉ, thay vì việc sử dụng phương pháp sẵn có addTarget cho nút không cần tạo tap cử chỉ cho nó như thế này

qsBlurButton.addTarget(self, action: #selector(self.tapBlurButton(_:)), forControlEvents: .TouchUpInside) 

func tapBlurButton(_ sender: UIButton) { 
    print("Please Help!") 
} 
+0

Ok, tôi đã thử nhưng tôi vẫn nhận được cùng một lỗi.Cũng nhận được cảnh báo "Không có phương thức nào được khai báo với bộ chọn Mục tiêu-C 'tapBlurButton:'" – Sebbe

+2

@Bạn cần phải đặt thuộc tính @objc trên phương thức chọn của mình. '@objc func tapBlurButton() ....' –

+2

Cố gắng thay đổi khai báo hàm của bạn bằng một khai báo của tôi. –

8

Swift 3

Trong trường hợp func cho bộ chọn trông giống như thế này (lưu ý: nó không có _):

func tapBlurButton(sender: UITapGestureRecognizer) { 
    print("Please Help!") 
} 

Sau đó chọn trông như thế này:

#selector(self.tapBlurButton(sender:)) 

Vì vậy, các mã cuối cùng cho bộ chọn là:

let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.tapBlurButton(sender:))) 

Nếu bạn không xác định rằng các tham số đầu tiên có _, sau đó bạn cần phải sử dụng tên đầy đủ của tham số đầu tiên.

4

Để thêm một nhận dạng cử chỉ bạn phải tạo một chỉ có chức năng nó sẽ gọi:

let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.handleTapFrom(recognizer:))) 

Sau đó thêm nó vào các yếu tố mà bạn cần. (Bạn đang sử dụng một nút, và như những người khác đã giải thích các nút có phương pháp tự nhiên 'addTarget' của họ)

Đối với mục đích giải thích tưởng tượng bạn muốn thêm nó vào một UIView:

self.someView.addGestureRecognizer(tapGestureRecognizer) 

Và đừng quên rằng một số yếu tố này là "không sử dụng tương tác" theo mặc định, do đó bạn có thể phải thay đổi thuộc tính đó quá:

self.someView.isUserInteractionEnabled = true 

Trong Swift 4 chức năng cần tuyên bố @objc:

@objc func handleTapFrom(recognizer : UITapGestureRecognizer) 
{ 
    // Some code... 
} 
+0

Trong Swift 4, hàm cần khai báo @objc. Tại sao? – khunshan

+0

Bởi vì trong Swift 3 nó đã được "suy ra" tự động. Tuy nhiên trong Swift 4 nó không còn nữa. @objc được sử dụng để trưng ra các phương thức cho thời gian chạy Objective-C. Chức năng này được gọi thông qua việc sử dụng một "bộ chọn" là một tính năng Mục tiêu-C, do đó bạn phải phơi bày nó với từ khóa này. – Pochi

Các vấn đề liên quan