2016-07-16 5 views
8

Im читает документацию на Apples swift (iOS), но ее написано для Swift 2, и я использую Swift 3. Я хочу добавить кнопку программно, но кажется, что есть изменения, и я не могу найти способ Исправить это.Swift3: Добавить кнопку с кодом

Вот код для примера 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") 
} 
} 

Единственное изменение я сделал после того, как "исправить-это показало, ошибка это в селекторе:

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

Этот должен был напечатать «кнопка нажата», но это не так. Любая помощь?

+0

насчет вашего (метод RatingControl.ratingButtonTapped кнопки :)? Это зависит от его реализации. –

+0

Не знаю, если это проблема, потому что все, что я написал, из примера Яблоков ... вот ссылка: tinyurl.com/q5oouqz –

+0

@OnurTuna селектор ссылается только на нее, она не должна зависеть от реализации – Gerald

ответ

12

Попробуйте что-нибудь подобное. Я не тестировал, но он должен работать:

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

Спасибо, что мне очень помогло. –

2

Обнаружено решение. По какой-то причине:

func ratingButtonTapped(button: UIButton) 

требуется кнопка «_» перед кнопкой. Так оно и должно быть:

func ratingButtonTapped(_ button: UIButton) 

А другая часть кода должна быть:

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

Спасибо за помощь :) Ваш метод может быть правильным, но тот также один Apple, хочет.

+1

В swift 3 все параметры называются даже первым параметром, в отличие от Swift 2. Лучшим решением является '#selector (RatingControl.ratingButtonTapped (button :))'. таким образом, вам не нужно менять свою функцию, чтобы использовать ее в селекторе – Gerald

17

Мой код:

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

Спасибо, это правильный ответ с точки зрения проблемы в документах при использовании Swift 3 вместо 2. – meburbo

Смежные вопросы