草庐IT

ios - 使表格 View 部分 swift 展开

coder 2024-01-17 原文

我正在关注 this展开和折叠我的表格 View 部分的教程。由于此演示是在 swift 2.2 中完成的,因此我已根据 swift 3.0 进行了所有更改。我在 if condition(currentSectionCells[row]["isVisible"]) 处被困在下面的函数中,它给我的错误是“类型‘NSFastEnumerationIterator.Element’(又名‘Any’没有下标成员)’”。

func getIndicesOfVisibleRows() {
    visibleRowsPerSection.removeAll()

    for currentSectionCells in cellDescriptors {
        var visibleRows = [Int]()

        for row in 0...((currentSectionCells as! [[String: AnyObject]]).count - 1) {
            if currentSectionCells[row]["isVisible"] as! Bool == true {
                visibleRows.append(row)
            }
        }

        visibleRowsPerSection.append(visibleRows)
    }
}

我试过按如下方式进行类型转换

    func getIndicesOfVisibleRows() {
    visibleRowsPerSection.removeAll()

    for currentSectionCells in cellDescriptors {
        var visibleRows = [Int]()

        for row in 0...((((currentSectionCells) as? NSMutableArray)?.count)! - 1) {

            let temp = [currentSectionCells][row] as? NSMutableDictionary
            let temp2 = temp?["isVisible"] as! Bool

            if temp2  == true {
                visibleRows.append(row)
            }
        }

        visibleRowsPerSection.append(visibleRows)
    }
}

但这让我在运行时在这一行“let temp2 = temp?["isVisible"] as!Bool”上崩溃 崩溃显示“EXC_BAD_INSTRUCTION”并且温度显示为零。

请大家帮忙。时间差

TableView 委托(delegate)和数据源

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    if cellDescriptors != nil {
        return cellDescriptors.count
    }
    else {
        return 0
    }
}


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return visibleRowsPerSection[section].count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let currentCellDescriptor = getCellDescriptorForIndexPath(indexPath: indexPath as NSIndexPath)
    let cell = tableView.dequeueReusableCell(withIdentifier: currentCellDescriptor["cellIdentifier"] as! String, for: indexPath) as! CustomCell

    if currentCellDescriptor["cellIdentifier"] as! String == "sectionCellIdentifier" {
        if let primaryTitle = currentCellDescriptor["secondaryTitle"]
        {
            cell.sectionTitleLabel.text = primaryTitle as? String
        }
    }
    else if currentCellDescriptor["cellIdentifier"] as! String == "shortAnswerCell" {
        cell.questionTitle.text = currentCellDescriptor["primaryTitle"] as? String
        cell.questionTextView.text = currentCellDescriptor["secondaryTitle"] as? String
        cell.answerTextView.text =  currentCellDescriptor["answerTitle"] as? String

    }

    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let indexOfTappedRow = visibleRowsPerSection[indexPath.section][indexPath.row]

    let temp = cellDescriptors[indexPath.section] as? NSArray
            let temp2 = temp?[indexOfTappedRow ] as? NSDictionary
            let temp3 = temp2?["isExpandable"] as! Bool

    if temp3 == true {
        var shouldExpandAndShowSubRows = false
        if temp3 == false {
            // In this case the cell should expand.
            shouldExpandAndShowSubRows = true
        }

        temp2?.setValue(shouldExpandAndShowSubRows, forKey: "isExpanded")

        for i in (indexOfTappedRow + 1)...(indexOfTappedRow + (temp2?["additionalRows"] as! Int)) {
            (temp![i] as AnyObject).setValue(shouldExpandAndShowSubRows, forKey: "isVisible")
        }
    }
    getIndicesOfVisibleRows()
    tblExpandable.reloadSections(NSIndexSet(index: indexPath.section) as IndexSet, with: UITableViewRowAnimation.fade)
}

最佳答案

我也参与了该教程并在 swift3 中成功完成了它。您的解决方案在下面给出并相应地修改。

    class yourClass: UIViewController
{


      @IBOutlet weak var profileTableView: UITableView!
    internal var visibleRowsPerSection = [[Int]]()
    internal var cellDescriptors: NSMutableArray!
        // VIEW DID LOAD
    override func viewDidLoad() {
        super.viewDidLoad()
        profileTableView.showsVerticalScrollIndicator = false
        loadProfileControllerData()
        profileTableSetUp()
    // Do any additional setup after loading the view.
    }

    func loadProfileControllerData(){
        if let path = Bundle.main.path(forResource: "CellDescriptor", ofType: "plist") {
            cellDescriptors = NSMutableArray(contentsOfFile: path)
        }
        getIndicesOfVisibleRows()
        profileTableView.reloadData()
    }
    // SHOW PARENT VISIBLE ROWS AND SAVE THERE ROW INDEX IN ARRAY
    func getIndicesOfVisibleRows() {
        visibleRowsPerSection.removeAll()
        for currentSectionCells in cellDescriptors.objectEnumerator().allObjects as! [[[String:Any]]]{
            var visibleRows = [Int]()
            for row in 0..<currentSectionCells.count {
                if currentSectionCells[row]["isVisible"] as! Bool == true {
                    visibleRows.append(row)
                }
            }
            visibleRowsPerSection.append(visibleRows)
            print(visibleRowsPerSection)
        }

    }
    // GET REQUIRED OBJECT OF TYPE [String: Any]
    func getCellDescriptorForIndexPath(indexPath: NSIndexPath) -> [String: Any] {
        let indexOfVisibleRow = visibleRowsPerSection[indexPath.section][indexPath.row]
        let cellDescriptorss = cellDescriptors[indexPath.section] as! NSArray
        let data = cellDescriptorss.object(at: indexOfVisibleRow) as! [String:Any]
        return data
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

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


// EXTENSION TO OUR PROFILE CLASS THAT DETERMINE OUR CLASS CONFIRM 2 IMPORTANT DELEGATES
extension profileViewController : UITableViewDelegate,UITableViewDataSource{
    //MARK-: TABLE VIEW DELEGATE FUNCTIONS

    // RETURN NUMBER OF  SECTION IN TABLE VIEW
    public func numberOfSections(in tableView: UITableView) -> Int{
        if cellDescriptors.count != 0{
            return cellDescriptors.count
        }
        else{
            return 0
        }

    }

    // RETURN NUMBER OF ROWS IN EACH SECTION OF TABLE VIEWS
    public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
        return visibleRowsPerSection[section].count
    }

    /* Return object of UITableViewCell that contains table SECTON data and USER profile data */

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
        let currentCellDescriptor = getCellDescriptorForIndexPath(indexPath: indexPath as NSIndexPath)
        let menuCell = tableView.dequeueReusableCell(withIdentifier: currentCellDescriptor["cellIdentifier"] as! String, for: indexPath) as! yourCellClass

        if currentCellDescriptor["cellIdentifier"] as! String == "parent"{

        }
        else if currentCellDescriptor["cellIdentifier"] as! String == "child"{
            menuCell.backgroundColor = UIColor.clear

        }

               return menuCell
    }

    public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){

        let indexOfTappedRow = visibleRowsPerSection[indexPath.section][indexPath.row]
        let cellDescriptorss = cellDescriptors[indexPath.section] as! NSArray
        var data = cellDescriptorss.object(at: indexOfTappedRow) as! [String:Any]

        if data["isExpandable"] as! Bool == true{
            var shouldExpandAndShowSubRows = false
            if data["isExpanded"] as! Bool == true{
                shouldExpandAndShowSubRows = false
                (cellDescriptorss[indexOfTappedRow] as AnyObject).setValue(shouldExpandAndShowSubRows, forKey: "isExpanded")
            }


            for i in (indexOfTappedRow + 1)...(indexOfTappedRow + (data["additionalRows"] as! Int)) {
                (cellDescriptorss[i] as AnyObject).setValue(shouldExpandAndShowSubRows, forKey: "isVisible")

            }
        }
        getIndicesOfVisibleRows()

        self.profileTableView.reloadSections(NSIndexSet(index: indexPath.section) as IndexSet, with: UITableViewRowAnimation.fade)

    }

关于ios - 使表格 View 部分 swift 展开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43818004/

有关ios - 使表格 View 部分 swift 展开的更多相关文章

  1. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  2. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  3. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  4. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  5. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  6. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  7. ruby-on-rails - Prawn - 表格单元格内的链接 - 2

    我正在尝试用Prawn生成PDF。在我的PDF模板中,我有带单元格的表格。在其中一个单元格中,我有一个电子邮件地址:cell_email=pdf.make_cell(:content=>booking.user_email,:border_width=>0)我想让电子邮件链接到“mailto”链接。我知道我可以这样链接:pdf.formatted_text([{:text=>booking.user_email,:link=>"mailto:#{booking.user_email}"}])但是将这两行组合起来(将格式化文本作为内容)不起作用:cell_email=pdf.make_c

  8. ruby-on-rails - 复数 for fields_for has_many 关联未显示在 View 中 - 2

    目前,Itembelongs_toCompany和has_manyItemVariants。我正在尝试使用嵌套的fields_for通过Item表单添加ItemVariant字段,但是使用:item_variants不显示该表单。只有当我使用单数时才会显示。我检查了我的关联,它们似乎是正确的,这可能与嵌套在公司下的项目有关,还是我遗漏了其他东西?提前致谢。注意:下面的代码片段中省略了不相关的代码。编辑:不知道这是否相关,但我正在使用CanCan进行身份验证。routes.rbresources:companiesdoresources:itemsenditem.rbclassItemi

  9. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  10. ruby - 如何使用 Ruby 将 CSV 文件读入 HTML 表格? - 2

    我正在尝试将一个简单的CSV文件读入HTML表格以在浏览器中显示,但我遇到了麻烦。这就是我正在尝试的:Controller:defshow@csv=CSV.open("file.csv",:headers=>true)end查看:输出:NameStartDateEndDateQuantityPostalCode基本上我只获取标题,而不会读取和呈现CSV正文。 最佳答案 这最终成为最终解决方案:Controller:defshow#OpenaCSVfile,andthenreaditintoaCSV::Tableobjectforda

随机推荐