在Swift中将日期选择器添加到警报中,以使用Core Data保存到本地数据库

6
我是一名可以帮助您翻译文本的助手。
我正在使用一个带有文本字段输入的弹出框来保存数据,我想知道的是,我想在弹出框中添加一个日期选择器,让用户先输入名称再选择日期。我已经成功地保存了名称,但是我遇到了麻烦,不知道如何添加日期选择器代码以及如何将其添加到弹出框中。以下是代码。
弹出框的代码:
if indexPath.row == 0 {
    let alert = UIAlertController(title: "Add New Chore", message: "", preferredStyle:
        UIAlertControllerStyle.alert)

    //this is the field where the user add the name
    alert.addTextField(configurationHandler: textFieldHandler)

    let a =  loggedInUsername
    if ((a?.lowercased().range(of: "mother")) != nil) {
        print("true")
        alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler:{ (UIAlertAction)in

            let newItem : String = (alert.textFields?.first?.text)!
            if !newItem.isEmpty {

                let item = Item(name: newItem)
//                        let item2 = Item(name: newItem2)
                self.saveItemInLocalDB(groceryItem: item!)

                self.setUpCollectionView()

            }
        }))

使用Core Data保存到本地数据库的代码:

func saveItemInLocalDB(groceryItem : Item) {
    let context = getContext()

    //retrieve the entity that we just created
    let entity =  NSEntityDescription.entity(forEntityName: "GroceryItem", in: context)

    let item = NSManagedObject(entity: entity!, insertInto: context)

    //set the entity values
    item.setValue(groceryItem.name, forKey: "name")
    item.setValue(false, forKey: "isSelected")
    item.setValue(loggedInUserHouseNumber, forKey: "houseNo")

    //save the object
    do {
        try context.save()
        print("ang item:", groceryItem.name)
        print("saved!")
    } catch let error as NSError  {
        print("Could not save \(error), \(error.userInfo)")
    } catch {

    }
}

问题已经得到回答 https://dev59.com/xqDia4cB1Zd3GeqPADns#55514206 - Karan Pal
3个回答

13

在Swift 5中向警报中添加日期选择器

    let myDatePicker: UIDatePicker = UIDatePicker()
    myDatePicker.timeZone = .local
    myDatePicker.preferredDatePickerStyle = .wheels
    myDatePicker.frame = CGRect(x: 0, y: 15, width: 270, height: 200)
    let alertController = UIAlertController(title: "\n\n\n\n\n\n\n\n", message: nil, preferredStyle: .alert)
    alertController.view.addSubview(myDatePicker)
    let selectAction = UIAlertAction(title: "Ok", style: .default, handler: { _ in
        print("Selected Date: \(myDatePicker.date)")
    })
    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
    alertController.addAction(selectAction)
    alertController.addAction(cancelAction)
    present(alertController, animated: true)

1
快速简便的选择:D - Thành Ngô Văn
在iOS 14上看起来很糟糕。 - Makalele
1
将 myDatePicker.preferredDatePickerStyle = .wheels 添加到 iOS 14 中,以查看轮式格式。 - Ric Santos

2

你可以使用以下代码:

步骤1:在顶部定义变量:

var datePicker:UIDatePicker = UIDatePicker()
let toolBar = UIToolbar()

步骤二:创建带文本字段的警报:

    //1. Create the alert controller.
    let alert = UIAlertController(title: "Some Title", message: "Enter a text", preferredStyle: .alert)

    //2. Add the text field. You can configure it however you need.
    alert.addTextField { (textField) in
        self.doDatePicker()
        textField.inputView = self.datePicker
        textField.inputAccessoryView = self.toolBar
    }

    // 3. Grab the value from the text field, and print it when the user clicks OK.
    alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { [weak alert] (_) in
        let textField = alert?.textFields![0] // Force unwrapping because we know it exists.
        if textField?.text != ""{
            print("Text field: \(textField?.text!)")
        }
    }))

    // 4. Present the alert.
    self.present(alert, animated: true, completion: nil)

步骤三:调用这些函数

func doDatePicker(){
    // DatePicker
  // datePicker = UIDatePicker()

    self.datePicker = UIDatePicker(frame:CGRect(x: 0, y: self.view.frame.size.height - 220, width:self.view.frame.size.width, height: 216))
    self.datePicker.backgroundColor = UIColor.white
    datePicker.datePickerMode = .date

    // ToolBar

    toolBar.barStyle = .default
    toolBar.isTranslucent = true
    toolBar.tintColor = UIColor(red: 92/255, green: 216/255, blue: 255/255, alpha: 1)
    toolBar.sizeToFit()

    // Adding Button ToolBar
    let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(HomeNewVC.doneClick))
    let spaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
    let cancelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(HomeNewVC.cancelClick))
    toolBar.setItems([cancelButton, spaceButton, doneButton], animated: true)
    toolBar.isUserInteractionEnabled = true

    self.toolBar.isHidden = false

}


@objc func doneClick() {
    let dateFormatter1 = DateFormatter()
    dateFormatter1.dateStyle = .medium
    dateFormatter1.timeStyle = .none

    datePicker.isHidden = true
    self.toolBar.isHidden = true
}

@objc func cancelClick() {
    datePicker.isHidden = true
    self.toolBar.isHidden = true
}

虽然Thing可以正常工作,但在实时情况下,我们应该避免在alertview中使用datepicker。

注意:不要使用它,而是制作一个弹出窗口或者使用.xib文件,在其中使用2个文本字段,一个用作名称,另一个用作日期选择器。

或者您也可以使用这个第三方支持,它与您的要求有些相似:- Alert Modifications


保存的数据是否属于某个人,例如如果我添加了姓名为Abhira和今天日期的数据,那么该数据就是Abhira并且日期等于今天。 - user9561472
先生,我可以把我的练习项目文件发送给您吗? - user9561472
你能将它集成到我的代码中吗?我的意思是整个代码,在其中我可以添加姓名,日期和地址。 - user9561472
是的,你可以。我会核实并通过邮件回复您。 - Abhirajsinh Thakore
好的,等一下我会为您格式化好代码并进行实现。 - Abhirajsinh Thakore
显示剩余13条评论

2
使用“空白新行”技巧,您可以在Swift 5中通过以下方式实现此目标:
let datePicker = UIDatePicker()
datePicker.frame = CGRect(x: 0, y: 40, width: 270, height: 200)

let alert = UIAlertController(title: "TITLE", message: "\n\n\n\n\n\n\n\n\n", preferredStyle: .alert)
alert.view.addSubview(datePicker)

let selectAction = UIAlertAction(title: "OK", style: .default, handler: { _ in
    print("Selected Date: \(datePicker.date)")
})
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)

alert.addAction(selectAction)
alert.addAction(cancelAction)

present(alert, animated: true)

看起来不错,但请记住这是hacky的,未来可能会出现问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接