如何自动 select 一个 UITableview Cell?
How to select a UITableview Cell automatically?
我正在开发测验应用程序。我收到来自 API 的问题。我正在使用 tableview 作为选项。
现在,当用户 select 回答第一个问题并按下一步时,会转到上一个问题。然后 selected 答案必须保持 selected.
我研究了很多,发现了这个:
Programmatically emulate the selection in UITableViewController in Swift
但我无法在我的 table 视图中自动 select 用户 selected 回答。
这是我的Present UI
VC
func getOptions(){
OptionArray.removeAll(keepCapacity: false)
Alamofire.request(.GET, "http://www.wins.com/index.php/capp/get_chapter_answers/\(EID)/\(QuestionID[Qindex])")
.responseJSON { (_, _, data, _) in
println(data)
let json = JSON(data!)
let catCount = json.count
for index in 0...catCount-1 {
let disp = json[index]["DISPLAY_STATUS"].string
if disp == "Y"{
let op = json[index]["ANSWER"].string
self.OptionArray.append(op!)
let ans = json[index]["RIGHT_ANSWER"].string
self.AnswerArray.append(ans!)
}
}
self.OptionTable.reloadData()
println(self.OptionArray.count)
}
}
@IBAction func Previous(sender: AnyObject) {
Qindex--
ShowQuestion()
}
@IBAction func Next(sender: AnyObject) {
Qindex++
ShowQuestion()
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.OptionArray.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.OptionTable.dequeueReusableCellWithIdentifier("Option") as! OptionCell
cell.Optionlabel?.text = self.OptionArray[indexPath.row]
cell.layer.masksToBounds = true;
cell.layer.cornerRadius = 6;
cell.layer.borderWidth = 2.0
cell.layer.borderColor = colorsArray[1].CGColor
return cell
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let indexPath = tableView.indexPathForSelectedRow();
let currentCell = tableView.cellForRowAtIndexPath(indexPath!) as! OptionCell;
if currentCell.selected == true{
currentCell.layer.borderWidth = 4.0
currentCell.layer.borderColor = colorsArray[6].CGColor
println(currentCell.Optionlabel?.text)
}
}
func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
let currentCell = tableView.cellForRowAtIndexPath(indexPath) as! OptionCell;
if currentCell.selected == false{
currentCell.layer.borderWidth = 2.0
currentCell.layer.borderColor = colorsArray[1].CGColor
}
}
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 70
}
更新
我有 20 多个问题。所以我必须分别保存每个问题的选定答案。
我不能select使用索引路径位置的答案,因为选项会在第二次访问时随机更改它的位置。
你可以这样做:
当您按 next
时,将所选答案的索引存储到一个变量中,当您返回 previous
时,在 willDisplayCell
方法中检查该索引并设置您的单元格被选中。
在你的控制器中取一个变量
var selectedAnsIndexPath:NSIndexPath?
您的下一个按钮操作类似于
@IBAction func Next(sender: AnyObject) {
self.selectedAnsIndexPath = tableView.indexPathForSelectedRow()
Qindex++
ShowQuestion()
}
然后
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
if(indexPath == self.selectedAnsIndexPath)
{
cell.setSelected(true, animated: false)
}
}
试试这个,它可能对你有用!
更新
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.OptionTable.dequeueReusableCellWithIdentifier("Option") as! OptionCell
cell.Optionlabel?.text = self.OptionArray[indexPath.row]
cell.QueID = QuestionID[Qindex]
cell.layer.masksToBounds = true;
cell.layer.cornerRadius = 6;
cell.layer.borderWidth = 2.0
cell.layer.borderColor = colorsArray[1].CGColor
if let val = examDic[cell.QueID]
{
if self.OptionArray[indexPath.row] == val
{
selectedAnsIndexPath = indexPath
cell.setSelected(true, animated: true)
cell.layer.borderWidth = 4.0
cell.layer.borderColor = colorsArray[6].CGColor
}
}
return cell
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if selectedAnsIndexPath != nil{
OptionTable.deselectRowAtIndexPath(selectedAnsIndexPath!, animated: false)
self.tableView(OptionTable, didDeselectRowAtIndexPath: selectedAnsIndexPath!)
println(selectedAnsIndexPath!.row)
}
let indexPath = OptionTable.indexPathForSelectedRow();
let currentCell = OptionTable.cellForRowAtIndexPath(indexPath!) as! OptionCell;
if currentCell.selected == true{
currentCell.layer.borderWidth = 4.0
currentCell.layer.borderColor = colorsArray[6].CGColor
var sqid = QuestionID[Qindex]
var sanswer = currentCell.Optionlabel!.text
examDic[sqid] = sanswer!
println(examDic)
}
}
我正在开发测验应用程序。我收到来自 API 的问题。我正在使用 tableview 作为选项。
现在,当用户 select 回答第一个问题并按下一步时,会转到上一个问题。然后 selected 答案必须保持 selected.
我研究了很多,发现了这个:
Programmatically emulate the selection in UITableViewController in Swift
但我无法在我的 table 视图中自动 select 用户 selected 回答。
这是我的Present UI
VC
func getOptions(){
OptionArray.removeAll(keepCapacity: false)
Alamofire.request(.GET, "http://www.wins.com/index.php/capp/get_chapter_answers/\(EID)/\(QuestionID[Qindex])")
.responseJSON { (_, _, data, _) in
println(data)
let json = JSON(data!)
let catCount = json.count
for index in 0...catCount-1 {
let disp = json[index]["DISPLAY_STATUS"].string
if disp == "Y"{
let op = json[index]["ANSWER"].string
self.OptionArray.append(op!)
let ans = json[index]["RIGHT_ANSWER"].string
self.AnswerArray.append(ans!)
}
}
self.OptionTable.reloadData()
println(self.OptionArray.count)
}
}
@IBAction func Previous(sender: AnyObject) {
Qindex--
ShowQuestion()
}
@IBAction func Next(sender: AnyObject) {
Qindex++
ShowQuestion()
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.OptionArray.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.OptionTable.dequeueReusableCellWithIdentifier("Option") as! OptionCell
cell.Optionlabel?.text = self.OptionArray[indexPath.row]
cell.layer.masksToBounds = true;
cell.layer.cornerRadius = 6;
cell.layer.borderWidth = 2.0
cell.layer.borderColor = colorsArray[1].CGColor
return cell
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let indexPath = tableView.indexPathForSelectedRow();
let currentCell = tableView.cellForRowAtIndexPath(indexPath!) as! OptionCell;
if currentCell.selected == true{
currentCell.layer.borderWidth = 4.0
currentCell.layer.borderColor = colorsArray[6].CGColor
println(currentCell.Optionlabel?.text)
}
}
func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
let currentCell = tableView.cellForRowAtIndexPath(indexPath) as! OptionCell;
if currentCell.selected == false{
currentCell.layer.borderWidth = 2.0
currentCell.layer.borderColor = colorsArray[1].CGColor
}
}
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 70
}
更新
我有 20 多个问题。所以我必须分别保存每个问题的选定答案。
我不能select使用索引路径位置的答案,因为选项会在第二次访问时随机更改它的位置。
你可以这样做:
当您按 next
时,将所选答案的索引存储到一个变量中,当您返回 previous
时,在 willDisplayCell
方法中检查该索引并设置您的单元格被选中。
在你的控制器中取一个变量
var selectedAnsIndexPath:NSIndexPath?
您的下一个按钮操作类似于
@IBAction func Next(sender: AnyObject) {
self.selectedAnsIndexPath = tableView.indexPathForSelectedRow()
Qindex++
ShowQuestion()
}
然后
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
if(indexPath == self.selectedAnsIndexPath)
{
cell.setSelected(true, animated: false)
}
}
试试这个,它可能对你有用!
更新
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.OptionTable.dequeueReusableCellWithIdentifier("Option") as! OptionCell
cell.Optionlabel?.text = self.OptionArray[indexPath.row]
cell.QueID = QuestionID[Qindex]
cell.layer.masksToBounds = true;
cell.layer.cornerRadius = 6;
cell.layer.borderWidth = 2.0
cell.layer.borderColor = colorsArray[1].CGColor
if let val = examDic[cell.QueID]
{
if self.OptionArray[indexPath.row] == val
{
selectedAnsIndexPath = indexPath
cell.setSelected(true, animated: true)
cell.layer.borderWidth = 4.0
cell.layer.borderColor = colorsArray[6].CGColor
}
}
return cell
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if selectedAnsIndexPath != nil{
OptionTable.deselectRowAtIndexPath(selectedAnsIndexPath!, animated: false)
self.tableView(OptionTable, didDeselectRowAtIndexPath: selectedAnsIndexPath!)
println(selectedAnsIndexPath!.row)
}
let indexPath = OptionTable.indexPathForSelectedRow();
let currentCell = OptionTable.cellForRowAtIndexPath(indexPath!) as! OptionCell;
if currentCell.selected == true{
currentCell.layer.borderWidth = 4.0
currentCell.layer.borderColor = colorsArray[6].CGColor
var sqid = QuestionID[Qindex]
var sanswer = currentCell.Optionlabel!.text
examDic[sqid] = sanswer!
println(examDic)
}
}