2017-07-30 1 views
0

J'ai un pickerView dans lequel il y a beaucoup de sujets. Chaque sujet est une classe comme ceci:Impossible de sélectionner la valeur par défaut de pickerView

class subjects { 
    var idSubject: String = ""; 
    var nameSubject: String = ""; 
    var notesSubject: String = ""; 
    var colorSubject: String = ""; 

    init(subjectId: String, subjectName: String, subjectNotes: String, subjectColor: String) { 
     idSubject = subjectId 
     nameSubject = subjectName 
     notesSubject = subjectNotes 
     colorSubject = subjectColor 
    } 

    func printSubject(){ 
     print(idSubject," - ",nameSubject," - ",notesSubject," - ",colorSubject) 
    } 
} 

Je mis mon pickerView ainsi:

public func numberOfComponents(in pickerView: UIPickerView) -> Int{ 
    return 1 
} 

public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{ 
    return MenuViewController.subjectsArray.count 
} 

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
    self.view.endEditing(true) 
    return MenuViewController.subjectsArray[row].nameSubject 
} 

Je veux sélectionner la ligne d'un sujet particulier, mais je ne peux pas parce qu'avec indexOf il "Impossible de convertir la valeur de type 'String' type d'argument attendu '(sujets) lancers francs -> Bool'" dans ces lignes de code:

if let index = MenuViewController.subjectsArray.indexOf("Matematica") { 
    self.subjectsMenu.selectRow(index, inComponent: 0, animated: true) 
} 

quelqu'un peut me aider?

+0

Quel est le type du tableau 'subjectsArray'? est-ce un tableau de 'sujets '(' [sujets] ')? –

Répondre

1
if let index = MenuViewController.subjectsArray.index(where: { 
    $0.nameSubject == "Matematica" 
}) { 
    self.subjectsMenu.selectRow(index, inComponent: 0, animated: true) 
} 
+0

au lieu de YourSubjectType qu'est-ce que je dois écrire? – Marco

+0

@Marco 'YourSubjectType' signifie le nom du type qui représente le sujet. Pour votre question cela signifie 'sujets' –

+1

Pour un tel cas, il n'est pas nécessaire de le lancer si vous le mentionnez comme paramètre de fermeture, vous pouvez l'utiliser tel quel; Vérifiez ma réponse pour le rendre plus clair pour vous :) –

1

Au lieu d'utiliser index(of:), la méthode appropriée pour un tel cas est index(where:):

renvoie le premier index dans lequel un élément de la collection répond à la sous-jacentes donné.

Ce qui est applicable parce que vous avez un tableau d'objet personnalisé (subjects), comme suit:

if let index = MenuViewController.subjectsArray.index(where: { (subjectsObject) -> Bool in 
    subjectsObject.nameSubject == "Matematica" 
}) { 
    print("found the desired index: \(index)") 
    self.subjectsMenu.selectRow(index, inComponent: 0, animated: true) 
} 

Remarques complémentaires:

  • le nom de votre la classe personnalisée doit être "Subject" au lieu de "sujets". Habituellement, le nom des classes fait référence à un objet singulier, avec upper camel case.

  • Lorsque l'on compare les chaînes: subjectsObject.nameSubject == "Matematica", il serait préférable de couper et comparer sa version inférieure/supérieure cas de celui-ci, comme suit:

    subjectsObject.nameSubject.lowercased().trimmingCharacters(in: .whitespaces) == "Matematica".lowercased().trimmingCharacters(in: .whitespaces)