如何防止 UIDatePicker 被多次初始化

Posted

技术标签:

【中文标题】如何防止 UIDatePicker 被多次初始化【英文标题】:How to prevent a UIDatePicker from being initialized multiple times 【发布时间】:2017-03-25 17:16:52 【问题描述】:

我有一个 UIDatePicker,根据我的代码,我相信每次选择表格视图中的单元格时,都会重新创建日期选择器,或者会发生类似于重新创建日期选择器的事情。我研究了一种叫做单例的东西,但我对它们的工作感到困惑,因为我是 swift 新手。单身人士会阻止这个问题吗?如果是这样,我将如何在我的代码中实现一个。如果不是,我该如何防止此问题发生?这是我用来调用 createDatePicker 的函数和函数 createDatePicker 的代码:

let datePicker = UIDatePicker()

func createDatePicker(indexPath: IndexPath, textField: UITextField)

    //Tool Bar
    let toolbar = UIToolbar()
    toolbar.sizeToFit()

    //Bar Button Item
    let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: nil, action: nil)
    toolbar.setItems([doneButton], animated: true)

    textField.inputAccessoryView = toolbar

    textField.inputView = datePicker





func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 


    if(indexPath.row != 0)

        let cell = tableView.cellForRow(at: indexPath) as! TableViewCell2

        cell.textField.isUserInteractionEnabled = true

        cell.textField.delegate = self

        if(indexPath.row == 2 || indexPath.row == 3)

            createDatePicker(indexPath: indexPath, textField: cell.textField)

        

        cell.textField.becomeFirstResponder()


        if(indexPath.row == 1)

            cell.textField.placeholder = "Event Title"

         else if(indexPath.row == 2)

            cell.textField.placeholder = "Start Time"

         else if(indexPath.row == 3)


            cell.textField.placeholder = "End Time"

        

    


提前感谢您的帮助!

【问题讨论】:

为什么为每个单元格创建单独的日期选择器会出现问题?您无需在 didSelect 方法中创建选择器。它可以是单元格上的属性。 【参考方案1】:

单例是正确的方式(就像DateFormatters,它也很重但经常被重复使用):

class GlobalDatePicker: UIDatePicker 
    static let shared = GlobalDatePicker()

您将在代码中使用单个日期选择器实例。

您还可以使用private init(),以防止调用者在不通过单例的情况下创建实例。

class GlobalDatePicker: UIDatePicker 
    static let shared = GlobalDatePicker()
    private init() 
    // Your methods that modify the picker here...

但您也可以在控制器中创建static variable

static var datePicker: UIDatePicker = 
    let picker = UIDatePicker()
    picker.datePickerMode = .date
    return picker
()

【讨论】:

【参考方案2】:

你可以让你的 datePicker 像静态一样:

static let datePicker = UIDatePicker()

那么你就不需要通过单例了。但是如果你想要单例,你可以通过this question 找到在 Swift-3 中实现单例行为的多种方法。

【讨论】:

以上是关于如何防止 UIDatePicker 被多次初始化的主要内容,如果未能解决你的问题,请参考以下文章

Vue中防止按钮的多次点击

如何防止文件被复制被拷贝,怎样禁止

如何防止云调度器多次触发一个函数?

如何防止使用php自动多次点击网站?

C# 开发技巧如何防止程序多次运行

在 Swift 中设置多次通知