带动态部分的Swift静态tableview

时间:2015-11-22 16:49:27

标签: ios swift uitableview

我有tableviewcontroller,有2个部分。

第一个(静态)部分有2行,第二部分应该是动态的。

故事板: enter image description here

代码:

class DocumentInventoryChangeTableViewController: UITableViewController {

    var results: [String] = ["Dog", "Cat", "Snake", "Test"]    

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.registerNib(UINib(nibName: "DocumentInventoryCell", bundle: nil), forCellReuseIdentifier: "DocumentInventoryCell")
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 2
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if section == 1 {
            return results.count
        }
        return 2
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell: UITableViewCell!
        if indexPath.section == 0 {
            cell = super.tableView(tableView, cellForRowAtIndexPath: indexPath)
        } else {
            cell = tableView.dequeueReusableCellWithIdentifier("DocumentInventoryCell", forIndexPath: indexPath)
            cell.textLabel?.text = results[indexPath.row]
        }
        return cell
    }
}

但是我收到了这个错误:

  

由于未捕获的异常'NSRangeException'而终止应用程序,原因是:

     

'*** - [__ NSArray0 objectAtIndex:]:索引0超出空的边界   NSArray的'

enter image description here

3 个答案:

答案 0 :(得分:0)

根据我的经验,在UITableViewController

中覆盖这些方法就足够了
tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
tableView(tableView: UITableView, indentationLevelForRowAtIndexPath indexPath: NSIndexPath) -> Int

如果要在表视图中使用自定义表格视图单元格,则需要使用nib创建UITableViewCell的子类,并将其注册到表视图中。

我的整个控制器看起来像这样:

var data = ["Ahoj", "Hola", "Hello"]

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.registerNib(UINib(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: "reuseIdentifier")
}

// MARK: - Table view data source

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if section == 1 {
        return data.count
    }
    return super.tableView(tableView, numberOfRowsInSection: section)
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    if indexPath.section == 1 {
        let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) as! CustomCell
        cell.titleLabel.text = data[indexPath.row]
        return cell
    }
    return super.tableView(tableView, cellForRowAtIndexPath: indexPath)
}

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return 44
}

override func tableView(tableView: UITableView, indentationLevelForRowAtIndexPath indexPath: NSIndexPath) -> Int {
    return 0
}

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    tableView.deselectRowAtIndexPath(indexPath, animated: true)
    if indexPath.section == 1 {
        print(data[indexPath.row])
    }
}

@IBAction func addItem() {
    data.append("Item \(data.count)")
    tableView.beginUpdates()
    tableView.insertRowsAtIndexPaths([NSIndexPath(forRow: data.count - 1, inSection: 1)], withRowAnimation: .Left)
    tableView.endUpdates()
}

@IBAction func removeItem() {
    if data.count > 0 {
        data.removeLast()
        tableView.beginUpdates()
        tableView.deleteRowsAtIndexPaths([NSIndexPath(forRow: data.count, inSection: 1)], withRowAnimation: .Left)
        tableView.endUpdates()
    }
}

答案 1 :(得分:-1)

问题在于没有表格视图,其中“第一(静态)部分有2行,第二部分应该是动态的”。您的表格视图需要完全动态;也就是说,它应该在故事板中显示原型单元而不是静态内容,并且应该在代码中配置其整个内容,包括第一部分 - 即使第一部分永远不会改变。

答案 2 :(得分:-1)

尝试这段代码并不完美,但你可以更好地拍照...我希望如此。 :)

class DocumentInventoryChangeTableViewController: UITableViewController {

    var results: [String] = ["Dog", "Cat", "Snake", "Test"]

    var firstSection = ["Naziv Documenta", "Local"]

    private var dict = [Int : SectionData]()

    override func viewDidLoad() {
        super.viewDidLoad()


        dict[0] = SectionData(data: firstSection)
        dict[1] = SectionData(data: results)

    }


    override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return "\(section)"
    }

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return dict.keys.count
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dict[section]!.data.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell = UITableViewCell()

        if let cel = tableView.dequeueReusableCellWithIdentifier("DocumentInventoryCell") ,
        let data = dict[indexPath.section]?.data[indexPath.row] {

            cel.textLabel?.text = data
            cell = cel
        }
        return cell
    }
}

private struct SectionData {
    var data = [String]()
}