2015-02-10 5 views
5

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

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

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

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

Так что это моя Раскадровка:

Storyboard

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

App Screenshot

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

спасибо.

Вот код, я в настоящее время:

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

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

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) 

} 

вы уверены, что disselect вещь правильный путь? все остальные в интернете научил меня использовать тег, однако, не сказать мне, как использовать его ...

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

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

fatal error: unexpectedly found nil while unwrapping an Optional value (lldb)

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

EDIT3 - подробнее:

я добавил Println в Tableview: функция cellForRowAtIndexPath в части, где я даю тег и выяснил, что метки были переданы успешно, и эти метки получили метки я присвоенные в однако, когда я проверил с помощью println в функции prepareForSegue, где переменные получают свои представления, чтобы проверить, получили ли они ярлыки, но я получил «ноль». В чем проблема?

+0

Я проверил ваше редактирование, и я думаю, что вы ошибаетесь в том, как присвоить значения индексам вашего массива. Во-первых, ваш массив _levels_ должен иметь тип 'NSMutableArray'. Затем ваш оператор присваивания должен измениться на: 'levels.insertObject (level, atIndex: indexPath.row)' – Lester

+0

aren'y NSMutableArray для назначения объектов в массиве ?? уровень и оценка имеют тип String и им пытаются сохранить их в массиве, чтобы они могли получать данные ниже: –

+0

Я получаю сообщение об ошибке «AnyObject» не конвертируется в «String» –

ответ

9

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

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

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 
    } 
+0

Нет, у меня есть одна пользовательская ячейка, и она будет дублироваться в моем UITableView. Каждая пользовательская ячейка представляет объект. Итак, если у меня есть ячейка, которая будет дублироваться, как мне получить оценку и уровень, который пользователь выбрал из КАЖДОГО из этих ячеек ??? Это проблема, с которой я сейчас сталкиваюсь. Извлечение пользовательских входов из каждой из ячеек, которые я не знаю, как контролировать. –

+0

Отредактировано, надеюсь, что это помогает – Miknash

+0

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

3

Для сбора данных из ваших клеток после того, как пользователь закончит ввод данных (оценка и уровень), вы можете использовать метод UITableView делегата tableView:didDeselectRowAtIndexPath [Deselect ]

Код в вашем примере будет проходить в классе 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() 
    } 
    // ... 
} 

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

+0

Что такое tableView: didDeselectRowAtIndexPath делать? –

+0

Этот метод называется, в вашем случае, когда пользователь закончил редактирование оценки и уровня в конкретной ячейке и коснулся вне ячейки, чтобы нажать кнопку отправки или изменить следующую ячейку. Таким образом, отмена выбора отредактированной ячейки и возможность хранения данных ярлыков. Это помогает? – Lester

+0

вы можете проверить мои изменения и рассказать мне, в чем проблема? –

0

Я знаю, что это очень старое сообщение, но затем, если это поможет кому-то, я буду счастлив, поэтому для этого простым способом, который я предпочту, сделана массив ячейки представления таблицы пользовательского интерфейса и вызвал ее в UI View Controller, а затем это становится очень просто просто называется массив (Спасибо Rohan)

(НАПРИМЕР)

import UIKit 


public class PlanningTableView:UITableViewCell{ 

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

} 

(и сейчас в VIEW CONTROLLER СДЕЛАТЬ эТО)

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 - комментарии хороший/плохой цениться

Смежные вопросы