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()
}
}
Ok, also habe ich versucht, das obige zu tun, und ich bekomme immer noch das gleiche Ergebnis ... Irgendwelche anderen Ideen ??? – thedragon19
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. –