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