2016-07-16 14 views
8

Czytam dokumentację Apple swift (iOS), ale jest napisana dla Swift 2 i używam Swift 3. Chcę dodać programowo, ale wydaje się, że jest zmiana i nie mogę znaleźć naprawić to.Swift3: Dodaj przycisk z kodem

Oto kod na przykład Swift 2:

import UIKit 

class RatingControl: UIView { 

// MARK: Initialization 

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 

    // Buttons 
    let button = UIButton(frame: CGRect(x: 0, y: 0, width: 44, height: 44)) 
    button.backgroundColor = UIColor.red() 
    button.addTarget(self, action: #selector(RatingControl.ratingButtonTapped(_:)), forControlEvents: .TouchDown) 
    addSubview(button) 
} 

override func intrinsicContentSize() -> CGSize { 
    return CGSize(width: 240, height: 44) 
} 

// MARK: Button Action 

func ratingButtonTapped(button: UIButton){ 
    print("Button pressed") 
} 
} 

Jedyną zmianą zrobiłem po "fix-to pokazał błąd jest to w selektorze:

button.addTarget(self, action: #selector(RatingControl.ratingButtonTapped(button:)), for: .touchDown) 

ten powinien wydrukować "przycisk wciśnięty", ale tak nie jest. Jakaś pomoc?

+0

Co o swojej RatingControl.ratingButtonTapped (przycisk :) metody? To zależy od jego wdrożenia. –

+0

Nie wiem, czy to jest problem, ponieważ wszystko, co napisałem, pochodzi z przykładu na Jabłkach ... tutaj jest link: tinyurl.com/q5oouqz –

+0

@OnurTuna Selektor odwołuje się tylko do niego, nie powinien zależeć od implementacji – Gerald

Odpowiedz

12

Spróbuj czegoś takiego. Nie testowałem, ale powinno działać:

let button = UIButton(frame: CGRect(x: 0, y: 0, width: 44, height: 44)) 
button.backgroundColor = UIColor.red 
button.addTarget(self, action: #selector(ratingButtonTapped), for: .touchUpInside) 
addSubview(button) 

func ratingButtonTapped() { 
    print("Button pressed") 
} 
+0

Dzięki, że bardzo mi pomogło. –

2

Znaleziono rozwiązanie. Z jakiegoś powodu: musi poprzedzać przycisk "_". Tak powinno być:

func ratingButtonTapped(_ button: UIButton) 

A druga część kodu musi być:

button.addTarget(self, action: #selector(RatingControl.ratingButtonTapped(_:)), for: .touchDown) 

Dzięki za pomoc :) Twój metoda może być prawidłowa, ale to również jeden Apple chce go.

+1

W swift 3 wszystkie parametry są nazwane, nawet pierwszy parametr, w przeciwieństwie do szybkiego 2. lepszym rozwiązaniem jest '#selector (RatingControl.ratingButtonTapped (button :))'. w ten sposób nie musisz zmieniać swojej funkcji tylko po to, aby użyć jej w selektorze – Gerald

17

Mój kod:

button.backgroundColor = UIColor.red 

button.addTarget(self, action: #selector(RatingControl.ratingButtonTapped(_:)), for: .touchDown) 

override var intrinsicContentSize : CGSize { 
//override func intrinsicContentSize() -> CGSize { 
    //... 
    return CGSize(width: 240, height: 44) 
} 

// MARK: Button Action 
func ratingButtonTapped(_ button: UIButton) { 
    print("Button pressed ") 
} 
+0

Dzięki, że jest to poprawna odpowiedź pod względem problemu w dokumentach podczas używania Swift 3 zamiast 2. – meburbo

Powiązane problemy