RatingControl-捕获从viewController单击的星星数量

ios swift

204 观看

4回复

161 作者的声誉

我在我的应用程序中使用RatingControl类(位于gitHub上)记录了4个条件(实例)的反馈。我必须从viewController分别捕获每个实例中单击的星星数。我如何捕获捕获从viewController单击的星星数量,以及如何区分单击了哪个实例。我相信我必须使用RatingControl类中的函数ratingButtonTapped,但不确定如何实现此目的。

下面的ViewController代码段:

class DetailsViewController: UIViewController {

  @IBOutlet weak var ratingControl1: RatingControl!
  @IBOutlet weak var ratingControl2: RatingControl!
  @IBOutlet weak var ratingControl3: RatingControl!
  @IBOutlet weak var ratingControl4: RatingControl!

  //I want to use some code within ViewController to capture the #stars clicked

RatingControl类如下:

@IBDesignable class RatingControl: UIStackView {

//MARK: Properties

private var ratingButtons = [UIButton]()

var rating = 0 {
    didSet {
        updateButtonSelectionStates()
    }
}

@IBInspectable var starSize: CGSize = CGSize(width: 44.0, height: 44.0) {
    didSet {
        setupButtons()
    }
}

@IBInspectable var starCount: Int = 5 {
    didSet {
        setupButtons()
    }
}

//MARK: Initialization

override init(frame: CGRect) {
    super.init(frame: frame)
    setupButtons()
}

required init(coder: NSCoder) {
    super.init(coder: coder)
    setupButtons()
}

//MARK: Button Action

func ratingButtonTapped(button: UIButton) {
    guard let index = ratingButtons.index(of: button) else {
        fatalError("The button, \(button), is not in the ratingButtons array: \(ratingButtons)")
    }

    // Calculate the rating of the selected button
    let selectedRating = index + 1

    if selectedRating == rating {
        // If the selected star represents the current rating, reset the rating to 0.
        rating = 0
    } else {
        // Otherwise set the rating to the selected star
        rating = selectedRating
    }

    print(selectedRating)
}


//MARK: Private Methods

private func setupButtons() {

    // Clear any existing buttons
    for button in ratingButtons {
        removeArrangedSubview(button)
        button.removeFromSuperview()
    }
    ratingButtons.removeAll()

    // Load Button Images
    let bundle = Bundle(for: type(of: self))
    let filledStar = UIImage(named: "filledStar", in: bundle, compatibleWith: self.traitCollection)
    let emptyStar = UIImage(named:"emptyStar", in: bundle, compatibleWith: self.traitCollection)
    let highlightedStar = UIImage(named:"highlightedStar", in: bundle, compatibleWith: self.traitCollection)

    for index in 0..<starCount {
        // Create the button
        let button = UIButton()

        // Set the button images
        button.setImage(emptyStar, for: .normal)
        button.setImage(filledStar, for: .selected)
        button.setImage(highlightedStar, for: .highlighted)
        button.setImage(highlightedStar, for: [.highlighted, .selected])

        // Add constraints
        button.translatesAutoresizingMaskIntoConstraints = false
        button.heightAnchor.constraint(equalToConstant: starSize.height).isActive = true
        button.widthAnchor.constraint(equalToConstant: starSize.width).isActive = true

        // Set the accessibility label
        button.accessibilityLabel = "Set \(index + 1) star rating"

        // Setup the button action
        button.addTarget(self, action: #selector(RatingControl.ratingButtonTapped(button:)), for: .touchUpInside)

        // Add the button to the stack
        addArrangedSubview(button)

        // Add the new button to the rating button array
        ratingButtons.append(button)
    }

    updateButtonSelectionStates()
}

private func updateButtonSelectionStates() {
    for (index, button) in ratingButtons.enumerated() {
        // If the index of a button is less than the rating, that button should be selected.
        button.isSelected = index < rating

        // Set accessibility hint and value
        let hintString: String?
        if rating == index + 1 {
            hintString = "Tap to reset the rating to zero."
        } else {
            hintString = nil
        }

        let valueString: String
        switch (rating) {
        case 0:
            valueString = "No rating set."
        case 1:
            valueString = "1 star set."
        default:
            valueString = "\(rating) stars set."
        }

        button.accessibilityHint = hintString
        button.accessibilityValue = valueString
    }
  }
}
作者: dacscan3669 的来源 发布者: 2017 年 9 月 15 日

回应 4


1

81 作者的声誉

也许您应该创建协议RatingControlDelegate

@objc protocol RatingControlDelegate: NSObjectProtocol {
    @objc optional func ratingButtonTapped(_ ratingControl: RatingControl)
}

然后在delegatevar中添加RatingControl

var delegate: RatingControlDelegate?

然后在下面添加委托方法ratingButtonTapped(:_)

func ratingButtonTapped(button: UIButton) {
    // ... end of func
    delegate?.ratingButtonTapped?(self)
}

DetailsViewController viewDidLoad(:_)

ratingControl1.delegate = self
ratingControl2.delegate = self
ratingControl3.delegate = self
ratingControl4.delegate = self

在执行中RatingControlDelegateDetailsViewController您将拥有ratingControl.rating变量:

func ratingButtonTapped(_ ratingControl: RatingControl) {
    ratingControl.rating // shows your rating

    // detect which instance has been clicked
    switch ratingControl {
    case ratingControl1:

    case ratingControl2:

    // etc.
    }
}
作者: Aleksandr Zarubin 发布者: 2017 年 9 月 15 日

1

333 作者的声誉

我已经使用HCSStarRatingView在我的项目中显示获取星级的信息,您可以在下面的链接中进行检查。

它通过(例如viwFeedBackStar.value)为我提供星级价值

https://github.com/hsousa/HCSStarRatingView

我知道根据您的实现它是不同的库,但它确实有效

获取ios中的星标

作者: Vivek Gajbe 发布者: 2017 年 9 月 15 日

0

656 作者的声誉

您应该使用StoreKit中苹果推荐的评级视图控制器“ SKStoreReviewController”

https://developer.apple.com/documentation/storekit/skstorereviewcontroller

作者: Ganesh Bavaskar 发布者: 2017 年 9 月 15 日

1

8569 作者的声誉

无需对代码进行任何更改。只需使用.rating属性访问当前额定值。

因此,在ViewController类中,当您需要访问评分值时,只需编写

print(ratingControl1.rating)
print(ratingControl2.rating)

但是,如果您需要在用户点击任何分级控件时访问分级值,请使用Aleksandr Zarubin 答案修改代码。

作者: Surjeet 发布者: 2017 年 9 月 15 日
32x32