2017-04-13 1 views
1

ich ein Drop-Down gender gemacht haben, die fein arbeitet jedoch habe ich eine andere Drop-down auf demselben viewcontroller die Dropdown zeigt aber, wenn ich das Element auszuwählen es Fehler gibt fatal error: unexpectedly found nil while unwrapping an Optional value Ich habe versucht, aber verwirrt. hilf mir, das bloodList dropdown zu lösen.Drop-Down-Liste Menü programatically in Swift Xcode

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)") 
} 
} 
+0

Setzen Sie Haltepunkte und versuchen, erfordern genau zu bestimmen, wo die NULL-Fehler ist Es ist nicht hilfreich, den gesamten Code aufzugeben. – Stonz2

Antwort

0

ich auf eine Antwort wartete aber nicht finden :(das ist ok. Dachte ich einige Male und dann mit diesem Code Yahoooo kommen !!! dann glaubte ich, ich bin wirklich ein Programmierer. Eigentlich habe ich nicht definiert die Bedingung für jede Tabelle Ansicht so war ich in Alptraum. Dieser Code rein programmatisch und nicht keine irritierenden dritte Party-Bibliothek oder umständlich Schoten

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)") 
    } 
} 
1

Erstellen Sie nicht wie dieses

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

Sie alle in Delegierten bauen sind Methoden der UITableView, können Sie es außer Kraft setzen sollte, können Sie es nicht ändern.

Anstatt eine Methode zu erstellen, versuchen Sie mit Bool Variable in der jeweiligen Schaltfläche Aktion.

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

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

} 

wie die Bedingungen ändern,

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

Verwendung der nicht aufgelösten Bezeichner 'isDrop' –

2

Sie keine Standard Delegatmethoden Ihrer Tableview ändern können, geben Bedingungen in den Delegatmethoden wie unten:

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

Auch ähnliche Veränderungen in der machen verbleibende Delegate-Methoden.

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)") 
    } 
} 
+0

' lassen Sie indexPath = genderTable.indexPathForSelectedRow' gibt Fehler 'erwarteten Ausdruck' –

+1

Was möchten Sie, wenn Sie die Zelle auswählen? – Sneha

+0

Ich möchte den Wert in der Konsole –