在Swift Xcode中以编程方式下拉列表菜单

时间:2017-04-13 08:35:16

标签: ios swift xcode drop-down-menu

我做了一个下拉gender工作正常但是我在同一个viewcontroller上有另一个下拉列表显示下拉但是当我选择项目时它会给出错误fatal error: unexpectedly found nil while unwrapping an Optional value我尝试过但很困惑。帮我解决bloodList下拉列表。

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var genderButton: UIButton!
@IBAction func genderButton(_ sender: Any) {
    self.PressDrop()
    view.addSubview(genderTable)
}
@IBOutlet weak var genderTable: UITableView!

var flag = 1
var dropDownList = [String]()
@IBOutlet weak var bloodButton: UIButton!
var bloodList = [String]()
@IBAction func bloodButton(_ sender: Any) {
    self.PressBlood()
    view.addSubview(bloodTable)
}
@IBOutlet weak var bloodTable: UITableView!

    override func viewDidLoad() {
    super.viewDidLoad()

    dropDownList = ["Male", "Female", "Other"]
    genderTable.delegate = self
    genderTable.dataSource = self
    genderTable.isHidden = true
    view.addSubview(genderTable) 
    genderTable.layer.cornerRadius = 10

    bloodList = ["A+", "A-", "AB+", "AB-"] 
    bloodTable.delegate = self
    bloodTable.dataSource = self
    bloodTable.isHidden = true
    view.addSubview(bloodTable)
    bloodTable.layer.cornerRadius = 10  
}

func PressDrop() {
    if flag == 0 {
        UIView.setAnimationDuration(0.5)
        self.genderTable.isHidden = true
        self.flag = 1
    }
    else{
        UIView.setAnimationDuration(0.5)
        self.genderTable.isHidden = false
        self.flag = 0
    }
}

func PressBlood() {
    if flag == 0 {
        UIView.setAnimationDuration(0.5)
        self.bloodTable.isHidden = true
        self.flag = 1
    }
    else{
        UIView.setAnimationDuration(0.5)
        self.bloodTable.isHidden = false
        self.flag = 0
    }
}

func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return dropDownList.count

}

func tableViewBlood(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return bloodList.count
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 50
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = genderTable.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    cell.textLabel!.text = dropDownList[indexPath.row]
    return cell
}

func tableViewTwo(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = bloodTable.dequeueReusableCell(withIdentifier: "bloodCell", for: indexPath)
    cell.textLabel!.text = bloodList[indexPath.row]
    return cell
}

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

    let   selectedData = dropDownList[indexPath.row]
    genderButton.setTitle(selectedData, for: .normal)
    self.genderTable.isHidden = true
    self.flag = 
    let indexPath = genderTable.indexPathForSelectedRow
    let currentCell = genderTable.cellForRow(at: indexPath!)! as UITableViewCell
    let finalresult = currentCell.textLabel!.text!
    print("\(finalresult)")
}

private func tableViewTwo(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let   selectedBlood = bloodList[indexPath.row]
    bloodButton.setTitle(selectedBlood, for: .normal)
    self.bloodTable.isHidden = true
    self.flag = 1
    let indexPathTwo = bloodTable.indexPathForSelectedRow
    let currentCellBlood = bloodTable.cellForRow(at: indexPathTwo!)! as UITableViewCell
    let finalresultBlood = currentCellBlood.textLabel!.text!
    print("\(finalresultBlood)")
}
}

3 个答案:

答案 0 :(得分:2)

您不能更改tableView的默认委托方法,在下面的委托方法中给出条件:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
      if tableView == genderTable {
          return dropDownList.count
      }
      return bloodList.count
    }

在剩余的委托方法中也进行类似的更改。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if tableView == genderTable {
        let cell = genderTable.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel!.text = dropDownList[indexPath.row]
        return cell
} else {
        let cell = bloodTable.dequeueReusableCell(withIdentifier: "bloodCell", for: indexPath)
        cell.textLabel!.text = bloodList[indexPath.row]
        return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
      if tableView == genderTable { 
        let   selectedData = dropDownList[indexPath.row]
        genderButton.setTitle(selectedData, for: .normal)
        self.genderTable.isHidden = true 
        let currentCell = genderTable.cellForRow(at: indexPath)! as UITableViewCell
        let finalresult = currentCell.textLabel!.text!
        print("\(finalresult)")
     } else {
        let   selectedBlood = bloodList[indexPath.row]
        bloodButton.setTitle(selectedBlood, for: .normal)
        self.bloodTable.isHidden = true
        let currentCellBlood = bloodTable.cellForRow(at: indexPath)! as UITableViewCell
        let finalresultBlood = currentCellBlood.textLabel!.text!
        print("\(finalresultBlood)")
   }
}

答案 1 :(得分:1)

不要像这样创作

func tableViewTwo(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell (This will consider as new method to your current class)

他们都在 UITableview 的构建委托方法中,你应该覆盖它,你不能改变它。

您可以在相应的按钮操作中尝试使用 Bool 变量,而不是创建方法。

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

If isDrop == true{
    return dropDownList.count
}else{
return bloodList.count
}

}

喜欢改变条件

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

答案 2 :(得分:0)

我等了一个答案,但没有找到:(那没关系。我想了很多次然后来这个代码yahoooo !!!然后我相信我真的是一个程序员。其实我没有定义了每个表视图的条件,所以我在噩梦中。这段代码是纯编程的,不需要任何恼人的第三个派对库或笨拙的 pods

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if tableView == tableViewB {
    return dropDownList.count
    }
    else {
    return genderL.count
    }
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if tableView == tableViewB { 
    let cell = tableViewB.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    cell.textLabel!.text = dropDownList[indexPath.row]
    return cell     
    }  
    else {
        let cell = genderT.dequeueReusableCell(withIdentifier: "gender", for: indexPath)
        cell.textLabel!.text = genderL[indexPath.row]
        return cell  
    }
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if tableView == tableViewB {
    let   selectedData = dropDownList[indexPath.row]
    buttonB.setTitle(selectedData, for: .normal)
    self.tableViewB.isHidden = true
    self.flag = 1
    let indexPath = tableViewB.indexPathForSelectedRow
    let currentCell = tableViewB.cellForRow(at: indexPath!)! as UITableViewCell
    let finalresult = currentCell.textLabel!.text!
    print("\(finalresult)")
    }
    else {
        let   selectedDataG = genderL[indexPath.row]
        genderB.setTitle(selectedDataG, for: .normal)
        self.genderT.isHidden = true
        self.flag = 1
        let indexPath = genderT.indexPathForSelectedRow
        let currentCell = genderT.cellForRow(at: indexPath!)! as UITableViewCell
        let finalresult = currentCell.textLabel!.text!
        print("\(finalresult)")
    }  
}