Получение данных от каждого UITableView Cells Swift

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

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

Я сделал 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

поэтому в функции расчета ГПД я положил

//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, где переменные получить их мнение, чтобы увидеть, если они получили ярлыки успешно, но я получил "ноль" там. В чем проблема?

3 ответа

Решение

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

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

//////// Тогда на самбите Баттон просто сделай это /////////////////

@IBAction func Submit(_ sender: Any) {

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

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

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

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

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

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

Другие вопросы по тегам