2017-06-01 2 views
2

Ich versuche eine App mit Swift zu erstellen, die der Notes App ähnelt, aber ich möchte eine Warnmeldung anzeigen lassen, wenn der Benutzer die "+" - Taste drückt, um eine neue Notiz hinzuzufügen - und die Warnung würde angezeigt der Benutzer, um einen Namen einzugeben. Der Name wird dann als neue Zeile in der zugrunde liegenden Tabelle hinzugefügt. Bisher war ich dazu in der Lage, aber jedes Mal, wenn ich auf das "+" - Zeichen klicke, werden die Schaltflächen, die ich zur Warnung hinzugefügt habe, erneut hinzugefügt. Mit anderen Worten, der Alarm sollte eine "OK" & eine Schaltfläche "Abbrechen" haben. Aber beim zweiten Mal erscheint der Alarm, es gibt 2 "OK" -Tasten und 2 "Abbrechen" -Tasten, und so weiter. Irgendwelche Ideen, wie ich das beheben kann? Danke für Ihre Hilfe!Warum duplizieren die Tasten auf meinem UIAlert?

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

@IBOutlet weak var table: UITableView! 

var data:[String] = [] 

//create alert controller 
var alert = UIAlertController(title: "Name", message: "Enter a name", preferredStyle: .alert) 



override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    self.title = "Notes" 

    //create "add" button 
    let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addAlert)) 
    self.navigationItem.rightBarButtonItem = addButton 
    //create edit button so we can delete rows 
    self.navigationItem.leftBarButtonItem = editButtonItem 
    load() 

} 

//function to add new note. This code is executed when the "Add" button is clicked 

func addNote() 
{ 
    //code to prevent being able to add rows while in edit mode 
    if (table.isEditing) { 
     return 
    } 

    let textField = self.alert.textFields![0] as UITextField 
    let name:String = textField.text! 
    data.insert(name, at: 0) 
    let indexPath:IndexPath = IndexPath(row: 0, section: 0) 
    table.insertRows(at: [indexPath], with: .automatic) 
    save() 
} 

func addAlert() 
{ 
    alert.addTextField(configurationHandler: { (textField) -> Void in 
     textField.placeholder = "Enter Name"}) 
    self.present(alert, animated: true, completion: nil) 
    //grab value from the text field and print when user clicks OK 
    alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { (UIAlertAction) in 
     let textField = self.alert.textFields![0] as UITextField 
     print("Text Field: \(textField.text!)") 
     self.addNote() 
    })) 
} 

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

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

override func setEditing(_ editing: Bool, animated: Bool) { 
    super.setEditing(editing, animated: animated) 
    //puts table in edit mode 
    table.setEditing(editing, animated: animated) 
} 

//function to delete rows from table 
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
    data.remove(at: indexPath.row) 
    table.deleteRows(at: [indexPath], with: .fade) 
    save() 
} 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    self.performSegue(withIdentifier: "detail", sender: nil) 


} 

func save() 
{ 
    UserDefaults.standard.set(data, forKey: "notes") 
    UserDefaults.standard.synchronize() 
} 

func load() 
{ 
    if let loadedData = UserDefaults.standard.value(forKey: "notes") as? [String] 
    { 
     data = loadedData 
     table.reloadData() 
    } 
} 

enter image description here

enter image description here

Antwort

1

Put alert.addAction bevor die Warnung vor. Versuchen Sie diesen Code in addAlert() Methode

func addAlert() 
{ 
var alert = UIAlertController(title: "Name", message: "Enter a name", preferredStyle: .alert) 
alert.addTextField(configurationHandler: { (textField) -> Void in 
     textField.placeholder = "Enter Name"}) 


    alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { (UIAlertAction) in 
     let textField = self.alert.textFields![0] as UITextField 
     print("Text Field: \(textField.text!)") 
     self.addNote() 
    })) 

    self.present(alert, animated: true, completion: nil) 

} 
+0

Ok, also habe ich versucht, das obige zu tun, und ich bekomme immer noch das gleiche Ergebnis ... Irgendwelche anderen Ideen ??? – thedragon19

+0

var alert = UIAlertController (Titel: "Name", Nachricht: "Geben Sie einen Namen ein" preferredStyle: .alert) Deklarieren Sie einen Alert innerhalb der addAlert() - Methode. Ich habe das in meiner Antwort aktualisiert. –

0

Sie müssen die Warnung erst nach dem Hinzufügen der Aktionen (Schaltflächen).

func addAlert() 
    { 
    alert.addTextField(configurationHandler: { (textField) -> Void in 
     textField.placeholder = "Enter Name"}) 
    //grab value from the text field and print when user clicks OK 
    alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { (UIAlertAction) in 
     let textField = self.alert.textFields![0] as UITextField 
     print("Text Field: \(textField.text!)") 
     self.addNote() 
    })) 
self.present(alert, animated: true, completion: nil) 
} 
+0

Ok, also habe ich versucht, das obige zu tun, und ich bekomme immer noch das gleiche Ergebnis ... Irgendwelche anderen Ideen ??? – thedragon19

+0

@ thedragon19 Nun ... Ich bekomme dieses Problem nicht, können Sie eine SS anhängen, was Sie bekommen? Anstatt die Warnung als globale Variable zu deklarieren, deklarieren Sie besser die Variable in add alert(). – Sneha

+0

In Ihrem qn, Sie erwähnten, OK und Abbrechen-Taste, aber in Ihrem Code sah ich keine Abbrechen-Taste. – Sneha

Verwandte Themen