Swift静态TableView添加额外的行

Posted

技术标签:

【中文标题】Swift静态TableView添加额外的行【英文标题】:Swift Static TableView adding additional rows 【发布时间】:2017-07-27 19:43:08 【问题描述】:

我正在尝试构建一个包含两个部分的 TableView。第二部分应填充数组中的数据。 Storyboard 有一个带有静态单元格的 TableView。有两个部分,每个部分都有一个单元格。

如果textSectionTwo 数组中只有一项,则它可以正常工作,但当其中有更多项时会中断

* 由于未捕获的异常 'NSRangeException' 导致应用程序终止,原因:'* -[__NSSingleObjectArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]'

代码下方:

enum TableViewSections 
    case sectionOne
    case sectionTwo


class TableViewController: UITableViewController 

    struct Identifier 
        static let sectionOneCell = "SectionOne"
        static let sectionTwoCell = "SectionTwo"
    

    let textSectionOne = "Section 1"
    let textSectionTwo = ["Section 2 - Row 1", "Section 2 - Row 2"]

    override func viewDidLoad() 
        super.viewDidLoad()

        tableView.register(UITableViewCell.self, forCellReuseIdentifier: Identifier.sectionOneCell)
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: Identifier.sectionTwoCell)

        tableView.reloadData()
    

    // MARK: - Table view data source

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        switch sectionForIndex(section) 

        case .sectionTwo?:
            return textSectionTwo.count     // <- breaks when return is > 1

        case nil:
            fatalError("Unexpected value")

        default:
            return super.tableView(tableView, numberOfRowsInSection: section)
        
    


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        switch sectionForIndex(indexPath.section) 
        case .sectionOne?:
            return self.tableView(tableView, sectionOneCellForRowAt: indexPath)

        case .sectionTwo?:
            return self.tableView(tableView, sectionTwoCellForRowAt: indexPath)

        case nil:
            fatalError("Unexpected value")
        
    


    private func tableView(_ tableView: UITableView, sectionOneCellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: Identifier.sectionOneCell, for: indexPath)
        cell.textLabel?.text = textSectionOne
        return cell
    


    private func tableView(_ tableView: UITableView, sectionTwoCellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: Identifier.sectionTwoCell, for: indexPath)
        cell.textLabel?.text = textSectionTwo[indexPath.row]
        return cell
    


    func sectionForIndex(_ index: Int) -> TableViewSections? 
        switch index 
        case 0:
            return .sectionOne

        case 1:
            return .sectionTwo

        default:
            return nil
        
    


编辑: 在this sample code from Appple 中与我的问题类似。他们使用静态单元格并通过代码添加内容。

【问题讨论】:

你认为 static 是什么意思? ;-) 为什么要注册这些单元,因为它们是在 Interface Builder 中设计的? 我知道静态是什么意思。我查看了这个Sample Code from Apple 并且有静态单元格,其中数据是通过代码添加的。 【参考方案1】:

静态表格视图用于呈现带有静态单元格 UI 和数据的表格视图。它将仅使用您在情节提要中制作的那些单元格。

解决方案:使用动态表格视图。它将允许您显示任意数量的行。

【讨论】:

以上是关于Swift静态TableView添加额外的行的主要内容,如果未能解决你的问题,请参考以下文章

UISearchDisplayController / ISearchResult TableView 在每个搜索中添加额外的行? IOS 7

如何使用 Swift 在静态表视图底部添加动态表视图?

Swift 将按钮操作添加到 TableView 单元格

编辑 tableview Swift 的行高

Firebase + Swift 删除 TableView 中的行

Firebase + Swift:无法删除 tableView 中的行