菜鸟教程小白 发表于 2022-12-13 01:23:04

ios - 使表格 View 部分 swift 展开


                                            <p><p>我关注 <a href="http://www.appcoda.com/expandable-table-view/" rel="noreferrer noopener nofollow">this</a>扩展和折叠我的表格 View 部分的教程。由于这个演示是在 swift 2.2 中完成的,所以我已经根据 swift 3.0 进行了所有更改。我在 if condition(currentSectionCells["isVisible"]) 处被困在下面的函数中,这给了我“类型'NSFastEnumerationIterator.Element'(又名'Any'没有下标成员)'”的错误。</p>

<pre><code>func getIndicesOfVisibleRows() {
    visibleRowsPerSection.removeAll()

    for currentSectionCells in cellDescriptors {
      var visibleRows = ()

      for row in 0...((currentSectionCells as! []).count - 1) {
            if currentSectionCells[&#34;isVisible&#34;] as! Bool == true {
                visibleRows.append(row)
            }
      }

      visibleRowsPerSection.append(visibleRows)
    }
}
</code></pre>

<p>我尝试过如下类型转换</p>

<pre><code>    func getIndicesOfVisibleRows() {
    visibleRowsPerSection.removeAll()

    for currentSectionCells in cellDescriptors {
      var visibleRows = ()

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

            let temp = as? NSMutableDictionary
            let temp2 = temp?[&#34;isVisible&#34;] as! Bool

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

      visibleRowsPerSection.append(visibleRows)
    }
}
</code></pre>

<p>但这让我在运行时在“let temp2 = temp?["isVisible"] as!Bool”这一行上崩溃
崩溃显示“EXC_BAD_INSTRUCTION”并且临时显示为 nil。</p>

<p>请帮助大家。 TIA</p>

<p> TableView 委托(delegate)和数据源</p>

<pre><code>func numberOfSectionsInTableView(tableView: UITableView) -&gt; Int {
    if cellDescriptors != nil {
      return cellDescriptors.count
    }
    else {
      return 0
    }
}


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -&gt; Int {
    return visibleRowsPerSection.count
}

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

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

    }

    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let indexOfTappedRow = visibleRowsPerSection

    let temp = cellDescriptors as? NSArray
            let temp2 = temp? as? NSDictionary
            let temp3 = temp2?[&#34;isExpandable&#34;] as! Bool

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

      temp2?.setValue(shouldExpandAndShowSubRows, forKey: &#34;isExpanded&#34;)

      for i in (indexOfTappedRow + 1)...(indexOfTappedRow + (temp2?[&#34;additionalRows&#34;] as! Int)) {
            (temp! as AnyObject).setValue(shouldExpandAndShowSubRows, forKey: &#34;isVisible&#34;)
      }
    }
    getIndicesOfVisibleRows()
    tblExpandable.reloadSections(NSIndexSet(index: indexPath.section) as IndexSet, with: UITableViewRowAnimation.fade)
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我也参与了该教程,并在 swift3 中成功完成了它。下面给出了您的解决方案,并进行了相应的修改。</p>

<pre><code>    class yourClass: UIViewController
{


      @IBOutlet weak var profileTableView: UITableView!
    internal var visibleRowsPerSection = []()
    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: &#34;CellDescriptor&#34;, ofType: &#34;plist&#34;) {
            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! [[]]{
            var visibleRows = ()
            for row in 0..&lt;currentSectionCells.count {
                if currentSectionCells[&#34;isVisible&#34;] as! Bool == true {
                  visibleRows.append(row)
                }
            }
            visibleRowsPerSection.append(visibleRows)
            print(visibleRowsPerSection)
      }

    }
    // GET REQUIRED OBJECT OF TYPE
    func getCellDescriptorForIndexPath(indexPath: NSIndexPath) -&gt; {
      let indexOfVisibleRow = visibleRowsPerSection
      let cellDescriptorss = cellDescriptors as! NSArray
      let data = cellDescriptorss.object(at: indexOfVisibleRow) as!
      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 OFSECTION IN TABLE VIEW
    public func numberOfSections(in tableView: UITableView) -&gt; 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) -&gt; Int{
      return visibleRowsPerSection.count
    }

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

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

      if currentCellDescriptor[&#34;cellIdentifier&#34;] as! String == &#34;parent&#34;{

      }
      else if currentCellDescriptor[&#34;cellIdentifier&#34;] as! String == &#34;child&#34;{
            menuCell.backgroundColor = UIColor.clear

      }

               return menuCell
    }

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

      let indexOfTappedRow = visibleRowsPerSection
      let cellDescriptorss = cellDescriptors as! NSArray
      var data = cellDescriptorss.object(at: indexOfTappedRow) as!

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


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

            }
      }
      getIndicesOfVisibleRows()

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

    }
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 使表格 View 部分 swift 展开,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/43818004/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/43818004/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 使表格 View 部分 swift 展开