每次按下按钮时如何将标签增加一?
Posted
技术标签:
【中文标题】每次按下按钮时如何将标签增加一?【英文标题】:How to increment label by one every time a button is pressed? 【发布时间】:2017-12-10 05:47:25 【问题描述】:在 Swift for ios 中进行开发时,我创建了一个 Int 数组,我将其标记为 amount
。数组中的每个 Int 表示特定项目的总数(amount
中的第一项表示汽车总数、第二辆公共汽车、第三辆自行车等)。使用表格视图,我在表格视图单元格内放置了一个按钮和标签。在表格视图中,我希望第一个单元格的标签在 amount
中显示第一个 Int,第二个单元格的标签在 amount
中显示第二个 Int,第三个单元格的标签在 amount
中显示第三个 Int,以及等我希望它的功能如下,每次触摸内部按钮时,我都希望相应的标签将其显示总数增加一。例如,如果在第三个单元格中点击按钮 7 次,我希望第三个单元格的标签显示 Int 7。如果在第五个单元格中点击按钮 2 次,我希望第五个单元格的标签显示 Int 2 . 解决此问题并完成此任务的最佳方法是什么?
@IBOutlet weak var flavorTable: UITableView!
//this is the array that I want to contain the Ints to display in each cell's label, 1st cell should display amount[0], 2nd cell amount[1], etc.
var amount = [Int]()
func bookieButton(_ sender: UIButton)
//this is where code that I want to increment the cell's label by one every time it is pressed but I'm unsure how to do so
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! FlavorCellTableViewCell
return cell
【问题讨论】:
这不是代码编写服务。您应该展示您尝试过的内容以及您面临的问题!请编辑您的问题并发布您的尝试。您应该花一些时间阅读网站部分 ***.com/help/how-to-ask 以及 Apple 的 Swift 书籍 itunes.apple.com/tr/book/the-swift-programming-language-swift-4/… 【参考方案1】:你想要达到的目标可以通过这种方式完成——:
我创建了一个dictionary
,其键为Integer
,值为[Int]
。为了保持每cell
每button
的点击数,这个key
将是一个单元格index
值,array
将保持tap
计数的总数。
在这种情况下,重要的一点是如何维护以前的cell
挖掘的count
数据,所以我为每个cell index
维护一个dictionary
+ 我维护了更多检查,我保存以前的tapped index
在 array 中,如果用户再次点击之前点击过的cell
,我 fetch 从 dictionary
保存 taps 以获取特定的单元格索引键,并将其更新并保存回来到字典。
检查代码以获得更好的理解,运行和调试你会理解的。
控制器类-:(工作代码)
import UIKit
class ViewController: UIViewController
// CELL DATA ARRAY
var data = [0,0,0,0,0,0,0,0,0,0]
// DICTIONARY TO HOLD NUMBER OF TAPS PER INDEX as [Int] (having tapped index as unique key)
var countDictionary = [Int:[Int]]()
// Array to hold tapped cell index
var indexs = [Int]()
// Initial tap count
var numberOfTapsPerCell : Int = 0
// This is the array given to dictionary as value(it has tapped count per cell)
var totalTaps = [Int]()
//MARK-: VIEW DID LOAD
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
// INITIALIZE total tap ARRAY WITH INDEX 0
totalTaps = Array(repeating: 0, count: 1)
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
// TABLE VIEW METHODS
extension ViewController:UITableViewDelegate,UITableViewDataSource
// NUMBER OF ROWS
func numberOfSections(in tableView: UITableView) -> Int
return 1
// number of sections
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return data.count
// Cell for row
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
// deque cell
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomCell
cell.customLabel.text = "Total taps : \(String(data[indexPath.row]))"
// CALL BACK BUTTON
cell.readCount = [weak self] cell in
// Get index path of tapped cell
let index = tableView.indexPath(for: cell)
// Variable that holds previously tapped counts fetched from dictionary
var previousCountIncrement = 0
/* This loop checks if user is tapping new cell or previously tapped cell. If he taps new cell we re-initialize numberOfTapsPerCell to 0 (else lock) ,else we fetch value from dictionary for particular row , and increment previous value by 1 and save back in dictionary(if block) */
for selectedIndex in (self?.indexs)!
if selectedIndex == index?.row
let previousIndexCount = self?.countDictionary[selectedIndex]
for numberSum in previousIndexCount!
previousCountIncrement = numberSum
previousCountIncrement += 1
cell.customLabel.text = "Total taps : \(String(previousCountIncrement))"
self?.data[selectedIndex] = previousCountIncrement
self?.totalTaps[0] = previousCountIncrement
self?.countDictionary[selectedIndex] = self?.totalTaps
return
else
self?.numberOfTapsPerCell = 0
/* Here we are saving tapped cell index in array. This is the code block which is always called once for each cell */
if let row = index?.row
self?.indexs.append(row)
self?.numberOfTapsPerCell += 1
self?.totalTaps[0] = (self?.numberOfTapsPerCell)!
self?.countDictionary[row] = self?.totalTaps
let dict = self?.countDictionary[row]
for value in dict!
cell.customLabel.text = "Total taps : \(String(value))"
self?.data[row] = value
return cell
自定义单元格类-:
import UIKit
class CustomCell: UITableViewCell
// Outlets
@IBOutlet weak var customCount: UIButton!
@IBOutlet weak var customLabel: UILabel!
// Call back function
var readCount : ((CustomCell)->())?
override func awakeFromNib()
super.awakeFromNib()
// Initialization code
// Cell button action
@IBAction func countTaps(_ sender: UIButton)
if let count = readCount
count(self)
override func setSelected(_ selected: Bool, animated: Bool)
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
希望对您有所帮助,如果有任何问题,请告诉我。谢谢
【讨论】:
【参考方案2】:斯威夫特 4.2
var incrementOrDecrementValue = 0
@IBOutlet weak var label: UILabel!
@IBAction func increaseButtonTapped(_ sender: Any)
incrementOrDecrementValue += 1;
self.label.text = "\(incrementOrDecrementValue)"
@IBAction func decreaseButtonTapped(_ sender: Any)
if(incrementOrDecrementValue != 0)
incrementOrDecrementValue -= 1;
self.label.text = "\(incrementOrDecrementValue)"
【讨论】:
【参考方案3】:最简单的方法应该是在 tableView: cellForRowAt:indexPath: 方法中的每个按钮上添加标签。您可以设置与 indexPath.row 相同的标签。
现在从 bookieButton: 方法,检查该发件人的标记值是什么。所以标签值与 indexPath.row 相同。现在用您的计数标签中的更新值更新该行。
您可以使用以下代码来更新单行,
let indexPath = NSIndexPath(forRow: rowNumber, inSection: 0)
self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Top)
【讨论】:
无法将按钮连接到重复的内容。 OP 需要子类化一个表格视图单元并将按钮连接到它。 他会设置标签一次...而不是重复时间。单元格标识符应类似于 @"Cell%d",indexPath.row。是的,子类也是另一种方法,因为他需要创建他的 customCellDelegate。我不知道你为什么在我的回答中否定。这种方法也是有效的。 单元标识符应该类似于@"Cell%d",indexPath.row。所以每一行都会有单独的标识符,并会使用特定的标签创建一次。【参考方案4】:你应该写下面的代码
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
let row = indexPath.row
if(row < self.amount.count)
self.amount[row] += 1
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .none)
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! FlavorCellTableViewCell
let row = indexPath.row
if(row < self.amount.count)
cell.countText = "\(self.amount[row])"
return cell
【讨论】:
以上是关于每次按下按钮时如何将标签增加一?的主要内容,如果未能解决你的问题,请参考以下文章
如何将照片(以及标签和按钮)放入滚动视图中,每次在情节提要中添加新照片时都会延长它
使用ajax在Django中点击like按钮时如何改变like按钮的颜色并增加一