Получение данных из каждой ячейки UITableView Swift

Вопрос:

Я много раз искал интернет и не нашел решения для моей ситуации. Вещи, которые могут быть решением, – это то, что я не понял, и они были в Objective-C. Так что, если это дубликат, это не так. Мне не удалось найти решение из других сообщений.

Я делаю калькулятор GPA специально для своей школы, где мы получаем разные баллы в зависимости от наших уровней.

Я сделал UITableView с пользовательской ячейкой, которая будет дублироваться определенное количество раз для каждого предмета в классе.

То, что я хочу знать, это получение данных из каждой из этих пользовательских ячеек (оценка и уровень)

Итак, это моя раскадровка:

Storyboard

и это мое приложение просматривается в симуляторе:

App Screenshot

Я собираюсь получить оценку и уровень, получив текст ярлыков по каждой теме, и я понятия не имею, как получить данные из определенных ячеек.

Большое спасибо.

Здесь код, который у меня есть:

//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 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]
//

Но я получаю сообщение об ошибке, когда массивы никогда не получали значений. может кто-то помочь?

EDIT:

У меня снова появилась ошибка, поэтому я попытался вручную передать строки массивам, а его инициализация, например

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!)
//

и теперь я получаю сообщение об ошибке

Неустранимая ошибка: неожиданно найден нуль при развертывании необязательного значения (Lldb)

может кто-нибудь помочь мне с этим?

EDIT3 – дополнительная информация:

я добавил println в tableView: cellForRowAtIndexPath в тех частях, где я даю теги, и узнал, что теги были успешно отправлены, и эти метки получили теги, которые я назначил в программе, однако, когда я проверил с помощью println в функции prepareForSegue в где переменные получают свои взгляды, чтобы узнать, получили ли они ярлыки, но я получил “ноль”. В чем проблема?

Лучший ответ:

Сначала извлеките свою ячейку, где она вам нужна (например, в файле 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…

У вас есть несколько вариантов: нужно пройти через каждую ячейку, проверить тип и получить его. Но похоже, что каждая ячейка другая. И похоже, что у вас есть порядок для этих ячеек. Значит, вы знаете, где именно будет ваш результат. Итак, в submit вы можете сделать следующее

@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
}

Но почему вы должны получить целую ячейку, чтобы получить одно значение? Как насчет того, что вы создаете несколько переменных (или даже лучше, массив) и извлекаете значения там? вы можете связать события с этими элементами управления, и когда они меняются, вы получаете эти значения и сохраняете их. Позже вы можете использовать эти значения (или массив), не обращаясь к ячейкам или не получая их.

EDIT:

Как насчет тегов? Я не уверен, добавляете ли вы это через код или раскадровку, но я пройду через оба из них.

В 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
    }

Ответ №1

Чтобы собрать данные из ваших ячеек после того, как пользователь завершил ввод данных (оценка и уровень), вы можете использовать метод делегата 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)
}

Далее, в вашей функции кнопки отправки (Selector) используйте “levelArray” и “scoreArray” для передачи ваших собранных данных. Обязательно объявляйте переменные массива/словаря (например: levelArray) прямо под объявлением класса UITableViewController, например

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

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

.., чтобы использовать его в других функциях, таких как функция действия кнопки отправки (Selector).

Ответ №2

Я знаю, что это очень старый пост, но затем, если он поможет кому-то, я буду счастлив, поэтому для этого простым способом, который я предпочту, сделана массив ячейки представления таблицы пользовательского интерфейса и вызвал ее в пользовательском интерфейсе 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 Button просто сделайте это /////////////////

@IBAction func Submit(_ sender: Any) {

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

Для получения дополнительной информации я только что создал первый учебник YouTube – комментарии хорошие/плохие оценены

Оцените статью
TechArks.Ru
Добавить комментарий