Swift Tableview单元格填充了name和Int值

时间:2015-05-07 13:19:02

标签: ios uitableview swift nsmutablearray

我正在尝试构建我的第一个应用程序而且我正在打一堵墙

我有一个视图控制器,在这个视图控制器里面是一个UITableView

现在我已经能够使用array.count填充此视图控制器

当我点击项目以标记已完成

时,我能够添加附件复选标记

现在我的问题是,我想点击一个项目,将其标记为已完成,并在完成时将标记值写在标签上

每个单元格都有不同的Int值

我已经阅读过某个地方,我需要使用NSMutableArray,但我不知道如何使用这个

任何帮助都会非常感激

继承人代码:

更新时间为8 1215 utc

import UIKit

// --------------------------------------------------------------------------------------------------------------------------\
class ViewController: UIViewController, UITableViewDataSource {                        //class and subclass                  |)
//---------------------------------------------------------------------------------------------------------------------------/
    // Variable and constant, also IBAOutlet


    struct CellData
    {
        var title: String
        var value: String
        var selected: Bool

    }

    var CellData1 = CellData(title: "this is a test", value: "1", selected: true)
    var CellData2 = CellData(title: "this is a test", value: "1", selected: true)
    var CellData3 = CellData(title: "this is a test", value: "1", selected: true)
    var CellData4 = CellData(title: "this is a test", value: "1", selected: true)

    var tableArray: [CellData] = []

    @IBOutlet weak var scoreshow: UILabel!
    @IBOutlet weak var tableView: UITableView!

// --------------------------------------------------------------------------------------

    override func viewDidLoad() {

        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()
    }
//----------------------------------------------------------------------------------------
    // checkmarks when tapped

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
    {
        if let cell = tableView.cellForRowAtIndexPath(indexPath) {
            if cell.accessoryType == .Checkmark
            {
                cell.accessoryType = .None
                cell.backgroundColor = UIColor.whiteColor()
            }
            else
            {
                cell.accessoryType = .Checkmark
                cell.backgroundColor = UIColor.yellowColor()            }
        }    
    }

//----------------------------------------------------------------------------------------
    //number of sections for the table

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 5
    }
//----------------------------------------------------------------------------------------
    //Calculate the amount of rows

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        return self.tableArray.count;
    }
//----------------------------------------------------------------------------------------
    //Cells text label and config

    func tableView(tableView: UITableView,cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{


        let cell:UITableViewCell = UITableViewCell(style:UITableViewCellStyle.Default, reuseIdentifier:"cell")
        cell.textLabel!.text = (tableArray[indexPath.row]).title
        scoreshow.text = (tableArray[indexPath.row]).value
        cell.textLabel!.numberOfLines = 0
        cell.selectionStyle = UITableViewCellSelectionStyle.None;

        return cell
 }

//----------------------------------------------------------------------------------------
    //resetbutton

    @IBAction func resetcheck(sender: UIButton) {

            for i in 0...tableView.numberOfSections()-1
            {
                for j in 0...tableView.numberOfRowsInSection(i)-1
                {
                    if let cell = tableView.cellForRowAtIndexPath(NSIndexPath(forRow: j, inSection: i)) {
                        cell.accessoryType = .None
                        cell.backgroundColor = UIColor.whiteColor()
                    }

                }
            }
        }

//----------------------------------------------------------------------------------------

2 个答案:

答案 0 :(得分:0)

首先,您应该做的是创建一个新的NSObject子类并进行设置,以便它接受诸如objectText和objectValue之类的属性。

然后,您可以根据需要创建任意数量的对象,并将它们存储在NSMutableArray

NSMutableArrays与您在此处所做的相同..

let section1 =
    ["this is used",
     "this is used to test",
     "this is used to test the lenght",
     "this is used to test the lenght of the text",
     "this is used to test the lenght of the text",
     "this is used to test the lenght of the text",
     "this is used to test the lenght of the text",
     "this is used to test the lenght of the text",
     "this is used to test the lenght of the text",]

排序......除了你想让它变成var而不是让它你可以修改它。

你最终得到的结论是:

let object1: MyNewModel = MyNewModel("this is used", value: 1)
section1.append(object1)

如果你为你的模型创建了一个不错的初始化方法,你就可以轻松设置它。

现在,您可以使用此可变数组以与执行相同的方式填充tableview,但不是仅将文本设置为数组中的该对象,而是将其设置为:

((MyNewModel)section1[indexPath.row]).objectText

您要做的下一件事是将UITableViewCell子类化,并在单元格位置内部放置一些您希望用这些模型中的文本填充的标签。因此,给他们一些公共属性来访问表格单元格内的标签,替换这一行:

let cell:UITableViewCell =
UITableViewCell(style:UITableViewCellStyle.Default, reuseIdentifier:"cell")

有了这个:

let cell = MyNewTableCell(style:UITableViewCellStyle.Default, reuseIdentifier:"cell")

然后,您将可以访问单元格内的新标签并将其设置为:

cell.myTextLabel!.text = ((MyNewModel)section1[indexPath.row]).objectText
cell.myValueLabel!.text = ((MyNewModel)section1[indexPath.row]).objectValue

您可以随时隐藏或显示您想要显示的内容。

答案 1 :(得分:0)

您需要改变方法。

当用户对单元格执行某些操作(例如选择它)时,您正在抓取单元格(使用tableView.cellForRowAtIndexPath())并进行更改。

这是做错事的错误方式。

你想要做的是有一个数组(可变数组,或Swift中的var数组),它记录你的能够查看的当前状态。文本内容,整数值,选择状态等

然后在cellForRowAtIndexPath中,使用数组中的数据配置单元格。

如果用户点击一个单元格,请获取该单元格的数组条目,更改它,然后告诉表格视图重绘该单元格(使用reloadRowsAtIndexPaths)。

我建议创建一个结构来存储您单元格的所有信息:

struct CellData
{
  var title: String
  var value: Int
  var selected: Bool
}

...

var tableArray: [CellData]

然后编写cellForRowAtIndexPath方法,通过从结构数组中获取这些值来配置单元格。

您的代码创建3个不同的不可变数组section1,section2和section3,但numberOfSectionsInTableView返回固定值5,cellForRowAtIndexPath始终返回从section1构建的单元格。那很棘手。

如果您刚刚播放,请暂时跳过分段表格视图。这会让你感到困惑。从单个分段的表视图开始,获取其中的内容,然后稍后处理分段的表视图。

准备好分区表视图时,请尝试使用数组数组:

//The array for a section is an array of CellData
typealias sectionArray: [CellData] 

//The array for the whole table is an array of sectionArray arrays.
var tableArray: [sectionArray]

init()
{
  tableArray = [ 
    sectionArray[
      CellData(title:"section 0, row 0", value: 0, selected: false],
      CellData(title:"section 0, row 1", value: 1, selected: false],
      CellData(title:"section 0, row 2", value: 2, selected: false]
    ],
    sectionArray[
      CellData(title:"section 1, row 0", value: 10, selected: false],
      CellData(title:"section 2, row 1", value: 11, selected: false],
      CellData(title:"section 3, row 2", value: 12, selected: false]
    ]
  ]
}