每次按下按钮时如何将标签增加一?

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]。为了保持每cellbutton 的点击数,这个key 将是一个单元格index 值,array 将保持tap 计数的总数。

在这种情况下,重要的一点是如何维护以前的cell 挖掘的count 数据,所以我为每个cell index 维护一个dictionary + 我维护了更多检查,我保存以前的tapped index在 array 中,如果用户再次点击之前点击过的cell,我 fetchdictionary 保存 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

【讨论】:

以上是关于每次按下按钮时如何将标签增加一?的主要内容,如果未能解决你的问题,请参考以下文章

如何不只增加一次int数?

如何将照片(以及标签和按钮)放入滚动视图中,每次在情节提要中添加新照片时都会延长它

每次按下“写入”按钮时如何将字符串行写入文件

使用ajax在Django中点击like按钮时如何改变like按钮的颜色并增加一

如何防止在android片段中按下后退按钮时调用onCreateView

每次按下按钮“WPF动画”时,我如何重播相同的动画