UIAlert with / text field to table

时间:2014-10-18 04:59:56

标签: ios uitableview swift ios8

我的目标是在主视图中的表中创建一个新行,标题为存储在namePrompt中的UIAlert的输入。我怎么做到这一点?

目前,当我尝试创建一个新行时(使用iPad模拟器右上角的+按钮,运行iOS 8),它会崩溃应用程序。我不确定我做错了什么,并且对任何帮助都表示赞赏。

代码:

func insertNewObject(sender: AnyObject) {
//prompt for kid name
var namePrompt = UIAlertController(title: "Add Child", message: "Please enter child name", preferredStyle: UIAlertControllerStyle.Alert)
namePrompt.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: nil))
namePrompt.addAction(UIAlertAction(title: "Add Child", style: UIAlertActionStyle.Default, handler: nil))
namePrompt.addTextFieldWithConfigurationHandler({(textField: UITextField!) in
textField.placeholder = "Johnny"
})
self.presentViewController(namePrompt, animated: true, completion: nil)

let childName: AnyObject = namePrompt.textFields![0]

//add new object w/ above name
objects.insertObject(childName, atIndex: 0)
let indexPath = NSIndexPath(forRow: 0, inSection: 0)
self.tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)
}

我认为问题来自let childName: Any Object行和/或objects.insertObject行。

- 的修改 -

当我构建/运行项目时,代码中没有给出任何错误,但是当我尝试添加新行时,只要按下+按钮,我就会{{1}来自0x1fbaff4: nopw %cs:(%eax,%eax)。这与行Thread 1(在下面的代码段中)行相关(上面let object = objects[indexPath.row] as NSDate行的默认值是NSDAte)。我将objects.insertObject更改为NSDate并发生了同样的事情。

NSString

1 个答案:

答案 0 :(得分:1)

您似乎假设在显示警报后立即填写UIAlertController的textFields。这并没有给用户任何时间来实际填写字段。

let childName = namePrompt.textFields![0]行(及其后续行)改为其中一个按钮操作,并等待用户在阅读textField之前点按该按钮。

<强> - 编辑 -

以下是我建议修改的代码。我尽可能少地修改代码。请注意,有一个if语句可以防止空的childNames,但它不会防止有人进入一堆空格。你可能应该使这部分更加健壮。

func insertNewObject(sender: AnyObject) {
    //prompt for kid name
    var namePrompt = UIAlertController(title: "Add Child", message: "Please enter child name", preferredStyle: UIAlertControllerStyle.Alert)
    namePrompt.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: nil))
    namePrompt.addAction(UIAlertAction(title: "Add Child", style: UIAlertActionStyle.Default, handler: { (alertAction) in
        let childName = (namePrompt.textFields![0] as UITextField).text as String
        if childName != "" {
            self.objects.insert(childName, atIndex: 0)
            let indexPath = NSIndexPath(forRow: 0, inSection: 0)
            self.tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)
        }
    }))
    namePrompt.addTextFieldWithConfigurationHandler({(textField: UITextField!) in
        textField.placeholder = "Johnny"
    })
    self.presentViewController(namePrompt, animated: true, completion: nil)

}