RatingControl - 捕获从viewController点击的星星数量
我在我的应用程序中使用RatingControl类(在gitHub上找到)记录4个条件(实例)的反馈。我必须从viewController中分别捕获每个实例中点击的星的数量。我如何捕获捕获从viewController点击的星星数量,并区分哪个实例已被点击。我相信我必须使用RatingControl类的ratingButtonTapped函数,但不知道如何实现这一点。RatingControl - 捕获从viewController点击的星星数量
下面的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
}
}
}
也许你应该创建协议RatingControlDelegate
:
@objc protocol RatingControlDelegate: NSObjectProtocol {
@objc optional func ratingButtonTapped(_ ratingControl: RatingControl)
}
然后在RatingControl
添加delegate
VAR:
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
而且在RatingControlDelegate
在DetailsViewController
实施你必须ratingControl.rating
变量:
func ratingButtonTapped(_ ratingControl: RatingControl) {
ratingControl.rating // shows your rating
// detect which instance has been clicked
switch ratingControl {
case ratingControl1:
case ratingControl2:
// etc.
}
}
我已经使用HCSStarRatingView在我的项目 中显示星号取数,您可以在下面查看相同的链接。
它通过 (例viwFeedBackStar.value)给我提供明星价值
https://github.com/hsousa/HCSStarRatingView
我知道这是不同的库,按您的实现,但它确实有效
获取星级ratting在ios
您应该使用来自StoreKit的苹果推荐评级控制器“SKStoreReviewController”
https://developer.apple.com/documentation/storekit/skstorereviewcontroller
无需对代码进行任何更改。只需访问使用.rating属性的当前评级值。
所以视图控制器类中,当你需要访问的评价值只写
print(ratingControl1.rating)
print(ratingControl2.rating)
,但如果你需要访问的评价值作为用户水龙头上的任何等级的控制,然后用Aleksandr Zarubin答案modyfy你的代码。
谢谢。这是直截了当的,我正在寻找的方法。 – dacscan3669
您正在使用哪种回购?应该有一些功能或属性来访问提供的评级的当前值。 – Surjeet
在RatingControl类中有一个函数ratingButtonTapped,但是我不知道如何在单击按钮时从ViewController类捕获以及如何区分哪个实例按钮被单击。 – dacscan3669
分享回购链接。 – Surjeet