2016-09-21 18 views
33

đây là button của tôi đối tượnglàm thế nào để sử dụng phương pháp addTarget trong nhanh chóng 3

let loginRegisterButton:UIButton = { 
    let button = UIButton(type: .system) 
    button.backgroundColor = UIColor(r: 50 , g: 80, b: 130) 
    button.setTitle("Register", for: .normal) 
    button.translatesAutoresizingMaskIntoConstraints = false 
    button.setTitleColor(.white, for: .normal) 
    button.addTarget(self, action:#selector(handleRegister), for: .touchUpInside) 
    return button 
}() 

và đây là chức năng của tôi

func handleRegister(){ 

    FIRAuth.auth()?.createUser(withEmail: email, password: password,completion: { (user, error) in 

     if error != nil 
     { print("Error Occured")} 

     else 
     {print("Successfully Authenticated")} 
    })   
} 

Tôi nhận được biên dịch lỗi, nếu addTarget loại bỏ nó biên dịch thành công

+0

Hãy thử này 'button.addTarget (bản thân, hành động: #selector (handleRegister()), cho: .touchUpInside)'. – VRAwesome

+0

'handleRegister' hành động trong cùng một bộ điều khiển? Ngoài ra, bạn không đặt khung 'UIButton'. –

+0

có, tôi có một hàm khác cho các ràng buộc func ràng buộc của nó() {loginRegisterButton.centerXAnchor.constraint (bằngTo: inputview.centerXAnchor) .isActive = true loginRegisterButton.topAnchor.constraint (equalTo: inputview.bottomAnchor, constant: 12) .isActive = true loginRegisterButton.widthAnchor.constraint (bằngTo: inputview.widthAnchor) .isActive = true loginRegisterButton.heightAnchor.constraint (equalToConstant: 30) .isActive = true} – Ninja13

Trả lời

13

Hãy thử điều này

button.addTarget(self, action:#selector(handleRegister()), for: .touchUpInside). 

Chỉ cần thêm dấu ngoặc đơn với tên phương thức.

Ngoài ra bạn có thể tham khảo link: Value of type 'CustomButton' has no member 'touchDown'

+4

nó không hoạt động – Ninja13

+0

Thực ra, đừng thêm bất kỳ dấu ngoặc đơn nào –

61

Vâng, không thêm "()" nếu không có param

button.addTarget(self, action:#selector(handleRegister), for: .touchUpInside). 

và nếu bạn muốn có được người gửi

button.addTarget(self, action:#selector(handleRegister(_:)), for: .touchUpInside). 

func handleRegister(sender: UIButton){ 
    //... 
} 

Chỉnh sửa:

button.addTarget(self, action:#selector(handleRegister(_:)), for: .touchUpInside) 

không còn hoạt động, bạn cần phải thay thế _ trong bộ chọn với một tên biến mà bạn sử dụng trong tiêu đề chức năng, trong trường hợp này nó sẽ là sender, vì vậy đoạn code làm việc trở thành:

button.addTarget(self, action:#selector(handleRegister(sender:)), for: .touchUpInside) 
+0

ok thật dễ dàng ..nhưng cách thêm ví dụ giá trị .. 'button.addTarget (tự, hành động: #selector (handleRegister (str:" Hello ")), cho: .touchUpInside)' ? – marlonpya

+0

Bạn không thể đặt tham số trong bộ chọn. Hành động phụ thuộc vào nguồn gốc của mục tiêu. Nếu bạn muốn nhận được chuỗi của nút, hãy lấy nó từ người gửi trong handleRegister (người gửi: UIButton) để chuỗi = người gửi. currentTitle –

+0

Một trong những cách giải quyết là đặt tham số làm phần tử truy cập của nút. Nhưng không chắc chắn nếu điều này được chấp nhận bởi App Store kể từ khi tôi chỉ cố gắng cho các ứng dụng doanh nghiệp. –

2

Trong nhanh chóng 3 sử dụng này -

object?.addTarget(objectWhichHasMethod, action: #selector(classWhichHasMethod.yourMethod), for: someUIControlEvents) 

Ví dụ (từ mã của tôi) -

self.datePicker?.addTarget(self, action:#selector(InfoTableViewCell.datePickerValueChanged), for: .valueChanged) 

Chỉ cần cho một : sau tên phương pháp nếu bạn muốn người gửi dưới dạng tham số.

0

Nhận xét thứ hai của người đăng từ ngày 21 tháng 9 đã được phát hiện. Đối với những người có thể đến với chủ đề này sau này với cùng một vấn đề như poster, đây là một lời giải thích ngắn gọn. Các câu trả lời khác là tốt để ghi nhớ, nhưng không giải quyết các vấn đề phổ biến gặp phải bởi mã này.

Trong Swift, các khai báo được thực hiện với từ khóa let là hằng số. Tất nhiên nếu bạn định thêm các mục vào một mảng, mảng không thể được khai báo như là một hằng số, nhưng một điều khiển phân đoạn sẽ ổn, đúng không ?! Không, nếu bạn tham khảo điều khiển phân đoạn hoàn thành trong tuyên bố của nó.

Tham chiếu đối tượng (trong trường hợp này một UISegmentedControl, nhưng điều này cũng xảy ra với UIButton) trong việc kê khai của mình khi bạn nói .addTarget và để cho các mục tiêu được self, mọi thứ sụp đổ. Tại sao? Bởi vì self đang được xác định. Nhưng chúng tôi muốn xác định hành vi là một phần của đối tượng ... Tuyên bố nó lazily dưới dạng biến với var. Các lazy fools trình biên dịch suy nghĩ rằng self cũng được xác định - nó im lặng trình biên dịch của bạn từ chăm sóc tại thời điểm khai báo. Các biến được khai báo cực kỳ không được đặt cho đến khi chúng được gọi đầu tiên.Vì vậy, trong tình huống này, lazy phép bạn sử dụng các khái niệm về self mà không vấn đề trong khi bạn thiết lập các đối tượng, và sau đó khi đối tượng của bạn nhận được một .touchUpInside hoặc .valueChanged hoặc bất cứ tranh luận thứ 3 của bạn là ở bạn .addTarget(), THEN nó gọi trên khái niệm của self, mà tại thời điểm đó được thiết lập đầy đủ và hoàn toàn chuẩn bị để trở thành một mục tiêu hợp lệ. Vì vậy, nó cho phép bạn được lười biếng trong tuyên bố biến của bạn. Trong những trường hợp như vậy, tôi nghĩ họ có thể cho chúng tôi một từ khóa như necessary, nhưng nó thường được xem là một thực hành lười biếng, cẩu thả và bạn không muốn sử dụng nó trên tất cả các mã của bạn, mặc dù nó có thể có vị trí của nó trong loại này của tình hình. Những gì nó

Không có lazy let trong Swift (không lazy cho các hằng số).

Đây là Apple documentation on lazy.

Đây là Apple on variables and constants. Có nhiều hơn một chút trong Tài liệu tham khảo ngôn ngữ của họ theo số Declarations.

1

Hãy thử điều này với Swift 3

button.addTarget(self, action:#selector(ClassName.handleRegister(sender:)), for: .touchUpInside) 

Chúc may mắn!

6

Hãy thử với nhanh chóng 3

cell.TaxToolTips.tag = indexPath.row 
     cell.TaxToolTips.addTarget(self, action: #selector(InheritanceTaxViewController.displayToolTipDetails(_:)), for:.touchUpInside) 


func displayToolTipDetails(_ sender : UIButton) { 
     print(sender.tag) 
     let tooltipString = TaxToolTipsArray[sender.tag] 
     self.displayMyAlertMessage(userMessage: tooltipString, status: 202)  
} 
4
let button: UIButton = UIButton() 
    button.setImage(UIImage(named:"imagename"), for: .normal) 
    button.addTarget(self, action:#selector(YourClassName.backAction(_sender:)), for: .touchUpInside) 

    button.frame = CGRect.init(x: 5, y: 100, width: 45, height: 45) 
    view.addSubview(button) 

    public func backAction(_sender: UIButton) { 

    } 
0

Thay vì

let loginRegisterButton:UIButton = { 
//... }() 

Hãy thử:

lazy var loginRegisterButton:UIButton = { 
//... }() 

Điều đó sẽ sửa chữa các lỗi biên dịch !!!

3

Hãy thử điều này với Swift 4

buttonSection.addTarget(self, action: #selector(actionWithParam(_:)), for: .touchUpInside) 
func actionWithParam(sender: UIButton){ 
    //... 
} 

buttonSection.addTarget(self, action: #selector(actionWithoutParam), for: .touchUpInside) 
func actionWithoutParam(){ 
    //... 
} 
Các vấn đề liên quan