Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS swift中具有多个和单个选择的下拉表视图?_Ios_Swift_Xcode_Uitableview - Fatal编程技术网

iOS swift中具有多个和单个选择的下拉表视图?

iOS swift中具有多个和单个选择的下拉表视图?,ios,swift,xcode,uitableview,Ios,Swift,Xcode,Uitableview,我有一个过滤器,它是在视图控制器的下拉表视图中完成的。下拉表视图包含三个部分,即第1节、第2节和第3节。第1节和第3节应为单选,第2节应为多选。点击第1节时,它将展开表格视图单元格;点击第2节时,它将展开,第1节将关闭展开 当从每个部分选择选项时,用户应关闭并重新打开过滤器下拉表视图 我有四个问题: import UIKit protocol ExpandableHeaderViewDelegate { func toogleSection(header: ExpandableHeaderV

我有一个过滤器,它是在视图控制器的下拉表视图中完成的。下拉表视图包含三个部分,即第1节、第2节和第3节。第1节和第3节应为单选,第2节应为多选。点击第1节时,它将展开表格视图单元格;点击第2节时,它将展开,第1节将关闭展开

当从每个部分选择选项时,用户应关闭并重新打开过滤器下拉表视图

我有四个问题:

 import UIKit

protocol ExpandableHeaderViewDelegate {
func toogleSection(header: ExpandableHeaderView, section: Int)
 }

 class ExpandableHeaderView: UITableViewHeaderFooterView {

var delegate: ExpandableHeaderViewDelegate?
var section: Int!
var collapaseHandlerArray = [String]()

let button = UIButton()
let button2 = UIButton()

override init(reuseIdentifier: String?){
    super.init(reuseIdentifier: reuseIdentifier)
    self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(selectheaderAction)))
 }

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
 }

@objc func selectheaderAction(gestureRecognizer: UITapGestureRecognizer) {

    let cell = gestureRecognizer.view as! ExpandableHeaderView


   }

   func customInit(title: String, section: Int, delegate: ExpandableHeaderViewDelegate) {


    self.textLabel?.text = title




    self.section = section
    self.delegate = delegate

  }

override func layoutSubviews() {
    super.layoutSubviews()

    self.textLabel?.font = UIFont(name: "Nunito-Light", size: 12)
    self.textLabel?.textColor = UIColor(red: 64.0/255, green: 75.0/255, blue: 105.0/255, alpha: 1.0)
    self.contentView.backgroundColor = UIColor.white

}

 }
 class dropDownCell: UITableViewCell {

@IBOutlet weak var dropDownLbl: UILabel!
@IBOutlet weak var dropDwnBtn: UIButton!

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}

}
  • 当用户点击不同的部分时,它会自动关闭已经打开的部分吗

  • 表格视图应根据每个部分中的单元格数量调整高度及其位置

  • 如何对三个部分进行多个和单个选择

  • 即使下拉表视图关闭并重新打开,也应存储所选内容

  • 以下是迄今为止我尝试解决上述所有问题的代码:

     extension HomeViewController : UITableViewDelegate, UITableViewDataSource, ExpandableHeaderViewDelegate {
    
    
    
    
    func numberOfSections(in tableView: UITableView) -> Int {
    
        if locationListBool == true {
    
            return 1
    
        } else {
    
            return sectionss.count
    
            }
    
        }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if locationListBool == true {
    
            return autocompleteplaceArray.count
    
        } else {
    
            return sectionss[section].category.count
    
          }
        }
    
    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    
        if locationListBool == true {
    
            return 0
    
        } else {
    
        return 30
    
         }
    
      }
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    
        if locationListBool == true {
    
            return 30
    
        } else {
    
            if (sectionss[indexPath.section].expanded) {
    
    
    
               return 30
            } else  {
    
    
                return 0
    
            }
         }
    
       }
    
    func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    
        if locationListBool == true {
    
            return 0
    
        } else {
    
        return 2
    
    
        }
       }
    
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    
        if locationListBool == true {
    
            return nil
    
        } else {
    
        let header = ExpandableHeaderView()
        header.contentView.backgroundColor = UIColor.white
        header.customInit(title: sectionss[section].genre, section: section, delegate: self)
    
    
        return header
    
        }
        }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
        if locationListBool == true {
                let cell = tableView.dequeueReusableCell(withIdentifier: "placecell", for: indexPath) as! locationNameTableViewCell
    
                guard autocompleteplaceArray.count > 0 else {
    
                    return cell
                }
    
                cell.locationName.text = autocompleteplaceArray[indexPath.row]
    
    
    
                return cell
    
        } else {
    
        let cell = dropDownTbl.dequeueReusableCell(withIdentifier: "dropDownCell", for: indexPath) as! dropDownCell
    
        cell.dropDownLbl.text = sectionss[indexPath.section].category[indexPath.row]
        cell.selectionStyle   = .none
    
        return cell
    
        }
    
        }
    
    
       func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    
    
    
      }
    
    
    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    
        cell.backgroundColor = UIColor.clear
    
        if locationListBool == true {
    
            let lastRowIndex = tableView.numberOfRows(inSection: 0)
            if indexPath.row == lastRowIndex - 1  {
    
                tableView.allowsSelection = true
    
            } else {
    
                tableView.allowsSelection = true
            }
    
            }
    
         }
    
        func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            if locationListBool == true {
    
            if let indexPath = tableView.indexPathForSelectedRow  {
    
                let currentCell = tableView.cellForRow(at: indexPath) as! UITableViewCell
                searchText.text = (currentCell.textLabel?.text)
                searchText.text = autocompleteplaceArray[indexPath.row]
                placeIDString = autocompletePlaceIDArray[indexPath.row]
                print("placeIDString::::\(String(describing: placeIDString))")
    
                if placeIDString != nil {
    
                    getPlaceIDLatLong(placeIDs: placeIDString!)
                    print("get lat long \(getPlaceIDLatLong(placeIDs: placeIDString!))")
    
                }
    
          //            PrefsManager.sharedinstance.lastlocation = searchText.text
                locationText = searchText.text
                print("locationText::::\(String(describing: locationText))")
    
                }
    
    
            self.locationTableList.isHidden = true
    
            }
            else {
    
    
            }
    
        }
    
    
    func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
    
        switch indexPath.section {
        case 0:
            if let previousIndexPath = indexPathOfSelectedRowPaidBy {
                dropDownTbl.deselectRow(at: previousIndexPath as IndexPath, animated: false)
                dropDownTbl.cellForRow(at: previousIndexPath as IndexPath)?.accessoryType = UITableViewCellAccessoryType.none
            }
            indexPathOfSelectedRowPaidBy = indexPath as NSIndexPath?
            dropDownTbl.cellForRow(at: indexPath)?.accessoryType = UITableViewCellAccessoryType.checkmark
    
        case 1:
    
            dropDownTbl.cellForRow(at: indexPath)?.accessoryType = UITableViewCellAccessoryType.checkmark
    
    
        default:
    
            break
        }
    
        return indexPath
       }
    
    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) 
      {
    
        switch indexPath.section {
    
        case 0:
    
            if let previousIndexPath = indexPathOfSelectedRowPaidBy {
                dropDownTbl.deselectRow(at: previousIndexPath as IndexPath, animated: false)
                dropDownTbl.cellForRow(at: previousIndexPath as IndexPath)?.accessoryType = UITableViewCellAccessoryType.none
            }
            indexPathOfSelectedRowPaidBy = nil
    
        case 1:
            dropDownTbl.cellForRow(at: indexPath)?.accessoryType = UITableViewCellAccessoryType.none
    
    
    
    
        default:
    
            break
        }
    
      }
    
    
    func toogleSection(header: ExpandableHeaderView, section: Int) {
        sectionss[section].expanded = !sectionss[section].expanded
        dropDownTbl.beginUpdates()
    
        if sectionss[0].expanded{
    
    
            dropDownTbl.layer.frame = CGRect(x: 15, y: 152, width: 345, height: 300)
    
        } else if sectionss[1].expanded  {
    
    
            dropDownTbl.layer.frame = CGRect(x: 15, y: 152, width: 345, height: 230)
    
        } else if sectionss[2].expanded {
    
            dropDownTbl.layer.frame = CGRect(x: 15, y: 152, width: 345, height: 330)
    
        } else {
    
            dropDownTbl.layer.frame = CGRect(x: 15, y: 152, width: 345, height: 90)
        }
    
        for i in 0 ..< sectionss[section].category.count {
    
    
    
                dropDownTbl.reloadRows(at: [IndexPath(row: i, section: section)], with: .automatic)
    
        }
        dropDownTbl.endUpdates()
    }
    }
    
    下拉表视图单元格:

     import UIKit
    
    protocol ExpandableHeaderViewDelegate {
    func toogleSection(header: ExpandableHeaderView, section: Int)
     }
    
     class ExpandableHeaderView: UITableViewHeaderFooterView {
    
    var delegate: ExpandableHeaderViewDelegate?
    var section: Int!
    var collapaseHandlerArray = [String]()
    
    let button = UIButton()
    let button2 = UIButton()
    
    override init(reuseIdentifier: String?){
        super.init(reuseIdentifier: reuseIdentifier)
        self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(selectheaderAction)))
     }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
     }
    
    @objc func selectheaderAction(gestureRecognizer: UITapGestureRecognizer) {
    
        let cell = gestureRecognizer.view as! ExpandableHeaderView
    
    
       }
    
       func customInit(title: String, section: Int, delegate: ExpandableHeaderViewDelegate) {
    
    
        self.textLabel?.text = title
    
    
    
    
        self.section = section
        self.delegate = delegate
    
      }
    
    override func layoutSubviews() {
        super.layoutSubviews()
    
        self.textLabel?.font = UIFont(name: "Nunito-Light", size: 12)
        self.textLabel?.textColor = UIColor(red: 64.0/255, green: 75.0/255, blue: 105.0/255, alpha: 1.0)
        self.contentView.backgroundColor = UIColor.white
    
    }
    
     }
    
     class dropDownCell: UITableViewCell {
    
    @IBOutlet weak var dropDownLbl: UILabel!
    @IBOutlet weak var dropDwnBtn: UIButton!
    
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }
    
    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    
        // Configure the view for the selected state
    }
    
    }
    

    以下是在单元格中完成选择时的屏幕截图,以及删除重新打开的过滤器选择或更改所选选项后的屏幕截图,这些部分未关闭或已展开。例外结果:

    对于允许在表视图的不同部分中选择不同数量的单元格,没有内置支持

    但是,UITableViewDelegate协议包含函数
    tableView(\uu:willSelectRowAt:)

    如果您阅读该函数上的文档,它会显示:

    返回值

    用于确认或更改选定路径的索引路径对象 一行如果需要,返回除indexPath之外的NSIndexPath对象 要选择的另一个单元格。如果不需要该行,请返回nil 选中

    因此,您应该能够将视图控制器设置为表视图的代理,将allowsMultipleSelection标志设置为true,并在提供所需选择规则的
    表视图(uu:willSelectRowAt:)
    函数中实现逻辑


    尝试编写这样一个函数,如果您遇到问题,请发布您的代码,告诉我们它是如何无法满足您的需求的,我们将尽力帮助您解决它。

    您发布了所有代码,但没有提到您面临的问题。您能发布您拥有的屏幕截图,以及您希望获得的图像吗,还有什么是真正的错误?@George_E_2嘿,我已经更新了screenshots@George_E_2你能看看我的截图吗updated@AshleyMills谢谢你的建议..有没有它的示例代码。。基于我共享的代码。根据答案…“试着编写这样一个函数,如果你有问题,发布你的代码,告诉我们它如何无法满足你的需要,我们将尝试帮助你修复它。”不,我没有“它的任何示例代码”。这是你的应用程序,有你独特的要求。这不是一个代码编写服务。我看到您已经有了一个
    表视图(u:willSelectRowAt:)
    函数。现在,如果你想让用户点击的单元格被选中,你需要让它返回该单元格的indexath,如果不想,则返回nil。如果你想让我为你编写应用程序,我可以雇佣,因为我相信这里还有其他人。否则,您需要自己编写代码,我们将帮助您调试它。