【问题标题】:getting data from each UITableView Cells Swift从每个 UITableView Cells Swift 中获取数据
【发布时间】:2017-10-23 22:08:21
【问题描述】:

我已经在互联网上搜索了无数次,但没有找到解决我的情况的方法。可能是解决方案的东西是我不理解的东西,它们在 Objective-C 中。因此,如果这是重复的,则不是。我未能从其他帖子中获得解决方案。

我正在专门为我的学校制作一个 GPA 计算器,根据我们的学科水平,我们也会获得不同的分数。

我制作了一个带有自定义单元格的 UITableView,该单元格将为年级中的每个科目重复特定次数。

我想知道的是从每个自定义单元格中获取数据(分数和级别)

这是我的故事板:

这是我在模拟器中预览的应用:

我将通过获取每个主题的标签文本来获取分数和级别,但我不知道如何从特定单元格获取数据。

非常感谢。

这是我目前拥有的代码:

//showStepperValueLabel shows the level and showSliderValueLabel shows the score in the cells.
//customCell is my custom class for my custom cell.
//i have already declared the levels and scores array above in my class

func tableView(tableView: UITableView!, didDeselectRowAtIndexPath indexPath: NSIndexPath!) {
    let cell = tableView.cellForRowAtIndexPath(indexPath) as customCell
    var level: String! = cell.showStepperValueLabel.text
    var score: String! = cell.showSliderValueLabel.text
    levels[indexPath.row] = level
    scores[indexPath.row] = score

}


//yadiyadayada 



//and this is the part where the values get received(it's inside the prepareForSegue function)

    var engScore: String = scores[0]
    var engLevel: String = levels[0]
    var mathScore: String = scores[1]
    var mathLevel: String = levels[1]
    var sciScore: String = scores[2]
    var sciLevel: String = levels[2]
    var geoScore: String = scores[3]
    var geoLevel: String = levels[3]
    var hisScore: String = scores[4]
    var hisLevel: String = levels[4]
    var chiScore: String = scores[5]
    var chiLevel: String = levels[5]
    //

但我收到一个错误,即数组从未收到值。有人可以帮忙吗?

编辑:

我又遇到了一个错误,所以我尝试在初始化时手动将字符串提供给数组

var levels: [String] = ["H", "H", "H", "H", "H", "H"]
var scores: [String] = ["12", "23", "34", "45", "56", "67"]

该程序运行良好。因此得出结论,问题发生在数组接收字符串的部分

func tableView(tableView: UITableView!, didDeselectRowAtIndexPath indexPath: NSIndexPath!) {
    let cell = tableView.cellForRowAtIndexPath(indexPath) as customCell
    var level: String! = cell.showStepperValueLabel.text
    var score: String! = cell.showSliderValueLabel.text
    levels.insert(level, atIndex: indexPath.row)
    scores.insert(level, atIndex: indexPath.row)

}

你确定取消选择的方法是正确的吗?互联网上的其他人都教我使用标签,但没有告诉我如何使用它...

EDIT2:

所以我尝试使用标签。 这是我在 tableView 中写的:cellForRowAtIndexPath 函数

cell.showStepperValueLabel.tag = indexPath.row+10
cell.showSliderValueLabel.tag = indexPath.row

这就是我在prepareForSegue中写的

var engScore : UILabel! = self.view.viewWithTag(0) as? UILabel
    var mathScore: UILabel! = self.view.viewWithTag(1) as? UILabel
    var sciScore: UILabel! = self.view.viewWithTag(2) as? UILabel
    var geoScore: UILabel! = self.view.viewWithTag(3) as? UILabel
    var hisScore: UILabel! = self.view.viewWithTag(4) as? UILabel
    var chiScore: UILabel! = self.view.viewWithTag(5) as? UILabel

    var engLevel: UILabel! = self.view.viewWithTag(10) as? UILabel
    var mathLevel: UILabel! = self.view.viewWithTag(11) as? UILabel
    var sciLevel: UILabel! = self.view.viewWithTag(12) as? UILabel
    var geoLevel: UILabel! = self.view.viewWithTag(13) as? UILabel
    var hisLevel: UILabel! = self.view.viewWithTag(14) as? UILabel
    var chiLevel: UILabel! = self.view.viewWithTag(15) as? UILabel

所以在计算 GPA 的函数中我放了

//Get pxcs
    engpxc = engCredits*co.getEnglishPoints(engLevel.text!, engScore: engScore.text!)
    mathpxc = mathCredits*co.getNonLanguagePoints(mathLevel.text!, scoreRecieved: mathScore.text!)
    geopxc = geoCredits*co.getNonLanguagePoints(geoLevel.text!, scoreRecieved: geoScore.text!)
    hispxc = hisCredits*co.getNonLanguagePoints(hisLevel.text!, scoreRecieved: hisScore.text!)
    scipxc = sciCredits*co.getNonLanguagePoints(sciLevel.text!, scoreRecieved: sciScore.text!)
    chipxc = chiCredits*co.getChiPoints(chiLevel.text!, chiScore: chiScore.text!)
    //

现在我收到一个错误提示

致命错误:在展开可选值时意外发现 nil (lldb)

有人可以帮我解决这个问题吗?

EDIT3 - 更多信息:

我在 tableView 中添加了 println:cellForRowAtIndexPath 函数在我给出标签的部分中,发现标签已成功给出并且这些标签收到了我在程序中分配的标签但是当我在 prepareForSegue 函数中使用 println 检查时变量在哪里收到他们的意见,看看他们是否成功收到标签,但我在那里得到“零”。到底是什么问题?

【问题讨论】:

  • 我检查了您的编辑,我认为您将值分配给数组索引的方式出错了。首先,你的 levels 数组应该是NSMutableArray 类型。那么你的赋值语句应该变成:levels.insertObject(level, atIndex: indexPath.row)
  • 不是 NSMutableArray 用于在数组中分配对象吗? level 和 score 是 String 类型,我试图将它们存储到一个数组中,以便它们可以接收下面的数据
  • 我收到一个错误,'AnyObject' is not convertible to 'String'
  • 我需要查看更多代码来帮助您解决错误。
  • 你说得对,NSMutableArray 用于分配对象,甚至您的String 类型也是您需要插入到数组中的对象。如果您仍然不确定是否使用NSMutableArray,并且确定您的级别和分数属于String 类型,请在答案部分查看我的编辑。尝试以与我相同的方式声明您的数组,并按照我如何将级别和评分 String 对象分配给它们各自的数组。

标签: ios swift


【解决方案1】:

首先在您需要的地方检索您的单元格(例如在 didSelectRowAtIndexPath 中)。将您的 UITableViewCell 投射到您的自定义单元格中。然后根据需要访问单元格的属性。

由于您没有提供任何代码,我将提供简单的代码示例:

func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
    let cell = tableView.cellForRowAtIndexPath(indexPath) as YourCell
    //cell.value, cell.text, cell.randomValue or whatever you need
}

提交按钮呢,你想提交数据吧?而且你那里没有 indexPath...

你有几个选择,一个是遍历每个单元格,检查类型并获取它。但似乎你的每个细胞都是不同的。好像你有这些细胞的订单。所以你知道你的结果到底在哪里。因此,在提交时,您可以执行以下操作

@IBAction func submit_pressed(sender: UIButton) {
     var indexs = NSIndexPath.init(index: 10)
     // or which one(s) you need. you extract data from the cell similar to previous function
}

但是,为什么必须获取整个单元格才能获得一个值?您如何创建一些变量(甚至更好的数组)并在那里提取值?您可以将事件链接到这些控件,当它们发生变化时,您会获得这些值并保存它们。稍后,您可以在不访问单元格或检索它们的情况下使用这些值(或数组)。

编辑:

标签呢?我不确定您是通过代码还是情节提要添加此内容,但我会通过它们来添加。

在 cellForRowAtIndexPath 中,您可以简单地说 cell.tag = indexPath.row,或者更好:cell.tag = question.id(假设问题是您的自定义类)。这样,您就可以解决问题并回答具体问题。

这是带有标签的工作代码:

    @IBAction func test(sender: AnyObject) {
        var lbl : UILabel = self.tableView.viewWithTag(12) as UILabel!
        var cell : UITableViewCell = self.view.viewWithTag(3) as UITableViewCell!
        return ;
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = indexPath.row == 0 ? tableView.dequeueReusableCellWithIdentifier("firstCell", forIndexPath: indexPath) as UITableViewCell : tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) as UITableViewCell
        if(indexPath.row != 0){
        let item = toDoList[indexPath.row-1]

        cell.textLabel?.text = item.title
        NSLog("%d",indexPath.row)
        var integerncina = (indexPath.row + 10) as NSInteger!
        cell.textLabel?.tag = integerncina
        NSLog("%d", cell.textLabel!.tag)
        cell.tag = indexPath.row
        }
        // Configure the cell...

        return cell
    }

【讨论】:

  • 不,我有一个自定义单元格,它将在我的 UITableView 中复制。每个自定义单元格代表一个主题。因此,如果我有一个要复制的单元格,我如何获得用户从这些单元格中选择的分数和级别???这就是我目前遇到的问题。从我不知道如何控制的每个单元格中检索用户输入。
  • 已编辑,希望对您有所帮助
  • 我实际上听说过使用标签的解决方案,但我仍然不知道如何使用它。真的很抱歉,我是 ios 开发的新手。但是在我标记了这些标签之后,我究竟在哪里编写代码,我将标签的文本(用户输入)并将其提供给一些变量?
  • 好的,在您的提交中,您可以检查问题并查找带有标签的单元格:YourCell *cell = (YourCell*)[tableView viewWithTag:question.id];,然后您可以执行cell.textfield.text 之类的操作。另一种解决方案可能是(如果您有自己的原型单元类)是将NSInteger questionId; 添加到其定义中,然后将其用作cell.questionId = question.id。稍后,您可以遍历您的单元格并检查每个单元格并获得相应的答案/选定值。
  • question.id 的东西不起作用。你确定这很快,因为不是在 obj-C 中吗?
【解决方案2】:

我知道这是一个非常古老的帖子,但是如果它对某人有帮助,我会很高兴,所以我喜欢的简单方法是制作 UI 表格视图单元格的数组并在 UI 中调用它View Controller,然后这变得非常简单,只需调用数组(感谢 rohan)

(例如)

import UIKit


public class PlanningTableView:UITableViewCell{

    @IBOutlet weak var Sccode: UITextField!
    @IBOutlet weak var NoOfPatients: UITextField!

}

(现在在视图控制器中执行此操作)

import UIKit

class PlanningReport:UIViewController,UITableViewDelegate,UITableViewDataSource{

    var ScCode = [String]()
    var NoOfPatient = [String]()
    var CollectionOfCell = [PlanningTableView]()


 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
     let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! PlanningTableView
    CollectionOfCell.append(cell)
    return cell
}

//////// 然后在 sumbmit 按钮执行此操作 ///////////////

@IBAction func Submit(_ sender: Any) {

     CollectionOfCell.forEach { cell in
           ScCode.append(cell.Sccode.text!)
           NoOfPatient.append(cell.NoOfPatients.text!)
     }
}

For more details I just created a YouTube first ever tutorial - cmets 好/坏赞赏

【讨论】:

  • 不,它不起作用。 ScCode.append(cell.Sccode.text!) 未执行
【解决方案3】:

要在用户输入完数据(分数和级别)后从您的单元格中收集数据,您可以使用UITableView 委托方法tableView:didDeselectRowAtIndexPath[取消选择]

您实例中的代码将进入UITableViewController 类,看起来像这样。

override func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
    let cell = tableView.cellForRowAtIndexPath(indexPath) as YourCustomCellClass
    var levelArray:[String] = [] //Assuming you want to collect and store your cell data in an Array. You may use a Dictionary as well, whichever is more convenient.
    var scoreArray:[String] = []
    // levelArray.append(cell.levelLabel.text!)
    // scoreArray.append(cell.scoreLabel.text!)
    levelArray.insert(cell.levelLabel.text!, atIndex: indexPath.row)
    scoreArray.insert(cell.scoreLabel.text!, atIndex: indexPath.row)
}

接下来,在您提交按钮的操作(选择器)函数中,使用“levelArray”和“scoreArray”来传递您收集的数据。请务必在 UITableViewController 类声明下声明数组/字典变量(例如:levelArray),就像这样

class GpaCalculator: UITableViewController {
    var levelArray:[String] = []
    var scoreArray:[String] = []

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    // ...
}

..能够在其他功能中使用它,例如提交按钮的操作(选择器)功能。

【讨论】:

  • tableView:didDeselectRowAtIndexPath 是做什么的?
  • 在您的情况下,当用户完成对特定单元格的分数和级别的编辑并触摸单元格外部以点击提交按钮或编辑下一个单元格时,将调用此方法。因此,取消选择已编辑的单元格并允许您存储标签数据。这有帮助吗?
  • 你能检查我的编辑并告诉我问题是什么吗?
  • 你能检查一下我在问题中留下的 cmets
  • 是的,看看tableView:didDeselectRowAtIndexPath方法的变化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
  • 1970-01-01
  • 2016-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多