ToolBar完成按钮操作对UIDatePicker不起作用

sak*_*sut 4 uidatepicker uitoolbar uibarbuttonitem ios swift

我以编程方式在工具栏中的UIDatePicker上设置完成并取消按钮.但是,我无法检测完成和取消按钮的单击操作.我找不到问题的原因.这是我的代码:

@IBAction func btnDueDate_Click(sender: UIButton)
{
    var toolBar = UIToolbar()
    toolBar.barStyle = UIBarStyle.Default
    toolBar.translucent = true
    toolBar.tintColor = UIColor(red: 92/255, green: 216/255, blue: 255/255, alpha: 1)
    toolBar.sizeToFit()

    var doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("Done_Click"))
    var spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil)
    var cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("Cancel_Click"))

    toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false)
    toolBar.userInteractionEnabled = true

    self.datePicker.addSubview(toolBar)
    self.datePicker.hidden = false
}

func Done_Click()
{
    var dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "dd-MM-yyyy"
    self.btnDueDate.setTitle(dateFormatter.stringFromDate(self.datePicker.date), forState: UIControlState.Normal)
}

func Cancel_Click()
{
    self.datePicker.hidden = true
}
Run Code Online (Sandbox Code Playgroud)

你能帮我解决一下我做错了什么吗?

谢谢您的回答

最好的祝福

解决了:谢谢你的帮助,我通过编辑下面的代码行解决了这个问题:

self.view.addSubview(toolBar)
Run Code Online (Sandbox Code Playgroud)

当我添加工具栏作为子视图self.view,而不是作为子视图self.datePicker,它工作正常.

Kum*_*uzz 8

您的代码无法正常工作的原因是因为UIToolbar它与重叠UIDatePicker并且选择器正在接收所有输入.

我建议你使用属性inputAccessoryView和工具栏分配到这一点,但不幸的是,这是一个只读属性,同时UIButtonUIDatePicker


许多人正在使用的解决方法是使用a UITextField并将a 设置inputView为a UIDatePickerinputAccessoryViewa UIToolbar.我在下面做了一个小例子,你可以尝试一下.

//
//  ViewController.swift
//  DatePickerWithToolbar
//
//  Created by Stefan Veis Pennerup on 10/06/15.
//  Copyright (c) 2015 Kumuluzz. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var tvDueDate: UITextField!
    var datePicker = UIDatePicker()

    override func viewDidLoad() {
        setupDatePicker()
    }

    func setupDatePicker() {
        // Sets up the "button"
        tvDueDate.text = "Pick a due date"
        tvDueDate.textAlignment = .Center

        // Removes the indicator of the UITextField
        tvDueDate.tintColor = UIColor.clearColor()

        // Specifies intput type
        datePicker.datePickerMode = .Date

        // Creates the toolbar
        let toolBar = UIToolbar()
        toolBar.barStyle = .Default
        toolBar.translucent = true
        toolBar.tintColor = UIColor(red: 92/255, green: 216/255, blue: 255/255, alpha: 1)
        toolBar.sizeToFit()

        // Adds the buttons
        var doneButton = UIBarButtonItem(title: "Done", style: .Plain, target: self, action: "doneClick")
        var spaceButton = UIBarButtonItem(barButtonSystemItem: .FlexibleSpace, target: nil, action: nil)
        var cancelButton = UIBarButtonItem(title: "Cancel", style: .Plain, target: self, action: "cancelClick")
        toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false)
        toolBar.userInteractionEnabled = true

        // Adds the toolbar to the view
        tvDueDate.inputView = datePicker
        tvDueDate.inputAccessoryView = toolBar
    }

    func doneClick() {
        var dateFormatter = NSDateFormatter()
        //dateFormatter.dateFormat = "dd-MM-yyyy"
        dateFormatter.dateStyle = .ShortStyle
        tvDueDate.text = dateFormatter.stringFromDate(datePicker.date)
        tvDueDate.resignFirstResponder()
    }

    func cancelClick() {
        tvDueDate.resignFirstResponder()
    }  
}
Run Code Online (Sandbox Code Playgroud)