我有tableviewcontroller,有2个部分。
第一个(静态)部分有2行,第二部分应该是动态的。
代码:
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的'
答案 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]()
}