【发布时间】:2016-12-17 20:07:21
【问题描述】:
我正在尝试创建一个警报视图,在点击广告按钮后将一个或多个项目添加到我的表格视图中。在按下添加按钮时,alertview 应该出现三个文本字段,用于项目名称价格和数量,当按下确定按钮时,它将添加项目,无论数量是多少倍。当我点击按钮时,虽然我收到以下错误:
Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArray0 objectAtIndex:]: index 0 beyond bounds for empty NSArray'
函数如下:
func createAlertView() -> UIAlertController {
let view = UIView(frame: CGRect(x: CGFloat(0), y: CGFloat(0), width: CGFloat(250), height: CGFloat(100)))
let itemName = UITextField(frame: CGRect(x: CGFloat(10), y: CGFloat(0), width: CGFloat(252), height: CGFloat(25)))
itemName.borderStyle = .RoundedRect
itemName.placeholder = "Item Name"
itemName.keyboardAppearance = .Alert
itemName.delegate = self
view.addSubview(itemName)
let itemPrice = UITextField(frame: CGRect(x: CGFloat(10), y: CGFloat(30), width: CGFloat(252), height: CGFloat(25)))
itemPrice.placeholder = "Item Price"
itemPrice.borderStyle = .RoundedRect
itemPrice.keyboardAppearance = .Alert
itemPrice.delegate = self
view.addSubview(itemPrice)
let itemQuantity = UITextField(frame: CGRect(x: CGFloat(10), y: CGFloat(60), width: CGFloat(252), height: CGFloat(25)))
itemQuantity.placeholder = "Item Quantity"
itemQuantity.borderStyle = .RoundedRect
itemQuantity.keyboardAppearance = .Alert
itemQuantity.delegate = self
view.addSubview(itemQuantity)
let alertController = UIAlertController(title: "Add Item", message: nil, preferredStyle: .Alert)
alertController.view.addSubview(view)
return alertController
}
func createAlertViewItem(alertController: UIAlertController, itemName: String, itemStringPrice: String) {
let managedContext = self.bill.managedObjectContext
let entity = NSEntityDescription.entityForName("Item", inManagedObjectContext: managedContext!)
let newItem = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: managedContext)
if let itemName = alertController.textFields?.first?.text {
newItem.setValue(itemName, forKey: "name")
}
if let itemPriceString = alertController.textFields?[1].text {
let itemPriceNumber = Int(itemPriceString)
newItem.setValue(itemPriceNumber, forKey: "price")
}
do {
try managedContext!.save()
}
catch let error as NSError {
print("Core Data save failed: \(error)")
}
let currentItems = self.bill.mutableSetValueForKey("items")
currentItems.addObject(newItem)
self.tableView.reloadData()
}
@IBAction func addNewItem(sender: UIButton) {
let alertController = createAlertView()
let itemName = alertController.textFields![0].text
let itemPrice = alertController.textFields?[1].text
let itemQuantity: Int!
if alertController.textFields![2].text == "" {
itemQuantity = 0
} else {
itemQuantity = Int((alertController.textFields?[2].text)!)!
}
let okAction = UIAlertAction(title: "OK", style: .Default, handler: { (action) -> Void in
if itemQuantity == 0 || itemQuantity == 1 {
print(2)
self.createAlertViewItem(alertController, itemName: itemName!, itemStringPrice: itemPrice!)
} else {
for _ in 0...itemQuantity {
print(3)
self.createAlertViewItem(alertController, itemName: itemName!, itemStringPrice: itemPrice!)
}
}
})
alertController.addAction(okAction)
let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)
alertController.addAction(cancelAction)
presentViewController(alertController, animated: true, completion: nil)
}
我认为在将视图添加到警报视图时我遗漏了一些东西,但我看不到什么,因为我认为错误表明它找不到文本字段。不过我不能确定。不过,任何帮助都会很棒。谢谢!
【问题讨论】:
-
另外 - 您也可以在情节提要中创建自定义视图。将其添加到您希望它显示的视图控制器中。使其不可见或将其放置在屏幕外。然后在你想显示它的时候用一些动画呈现它。这个过程可以让您完全控制外观。
-
感谢您的帮助。如果我找不到 alertviewcontroller 的解决方案,我会尝试。
标签: ios swift uialertview