2017-05-31 78 views
0

我在我的代碼中有多個UIPickerView,讓我們假設用戶無意中打開PickerView,但希望保持選中同一行,就像我爲用戶觸摸已經選擇的行,選擇器是否隱藏?當用戶觸摸已選擇的行時,如何隱藏UIPIckerView

我試過這個:UIPicker detect tap/touch on currently selected row,但我無法讓它工作。

---編輯---

我會盡量做得更具體。我是編程和Swift語言的初學者。

這是我ViewController.swift

import UIKit 

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource { 

@IBOutlet weak var colorLabel: UILabel! 
@IBOutlet weak var sizeLabel: UILabel! 

@IBOutlet weak var colorButton: UIButton! 
@IBOutlet weak var sizeButton: UIButton! 

@IBOutlet weak var resultButton: UIButton! 

@IBOutlet weak var colorPickerView: UIPickerView! = UIPickerView() 
@IBOutlet weak var sizePickerView: UIPickerView! = UIPickerView() 

var colorPickerData = ["Blue", "Red"] 
var sizePickerData = ["Small", "Big"] 

var descri = String() 
var resultadoImagem = UIImage() 

override func viewDidLoad() { 
    super.viewDidLoad() 


    colorPickerView.isHidden = true 
    sizePickerView.isHidden = true 


    self.colorPickerView.delegate = self 
    self.colorPickerView.dataSource = self 

    self.sizePickerView.delegate = self 
    self.sizePickerView.dataSource = self 


    colorLabel.text = colorPickerData[0] 
    sizeLabel.text = sizePickerData[0] 
} 

override func didReceiveMemoryWarning() { 

    super.didReceiveMemoryWarning() 

} 

func numberOfComponents(in pickerView: UIPickerView) -> Int { 
    return 1 
} 

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
    if pickerView.tag == 1 { 
     return colorPickerData.count 
    } else if pickerView.tag == 2 { 
     return sizePickerData.count 
    } 
    return 0 
} 

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
    if pickerView.tag == 1 { 
     return "\(colorPickerData[row])" 
    } else if pickerView.tag == 2 { 
     return "\(sizePickerData[row])" 
    } 
    return "" 
} 

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
    if pickerView.tag == 1 { 
     colorLabel.text = colorPickerData[row] 
     colorPickerView.isHidden = true 
    } else if pickerView.tag == 2 { 
     sizeLabel.text = sizePickerData[row] 
     sizePickerView.isHidden = true 
    } 
} 

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    colorPickerView.isHidden = true 
    sizePickerView.isHidden = true 
} 

@IBAction func colorButton(_ sender: Any) { 
    colorPickerView.isHidden = !colorPickerView.isHidden 
} 

@IBAction func sizeButton(_ sender: Any) { 
    sizePickerView.isHidden = !sizePickerView.isHidden 
} 

@IBAction func resultButton(_ sender: Any) { 
    if (colorLabel.text == "Blue") 
     && (sizeLabel.text == "Big") { resultadoImagem = UIImage(named: "blue-big.png")!; descri = "BLUE"} 
    else if (colorLabel.text == "Blue") 
     && (sizeLabel.text == "Small") { resultadoImagem = UIImage(named: "blue-small.png)!; descri = "BLUE"} 
    else if (colorLabel.text == "Red") 
     && (sizeLabel.text == "Big") { resultadoImagem = UIImage(named: "red-big.png")!; descri = "RED"} 
    else if (colorLabel.text == "Red") 
     && (sizeLabel.text == "Small") { resultadoImagem = UIImage(named: "red-small.png")!; descri = "RED"} 

    self.performSegue(withIdentifier: "resultSegue", sender: nil) 
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "resultSegue" { 
     let DestViewController : SecondViewController = segue.destination as! SecondViewController 

    DestViewController.descText = descri 
    DestViewController.resultPhoto = resultadoImagem 
    } 
} 

} 

此代碼的偉大工程,當我打的「結果」按鈕,它會轉到SecondViewController並顯示照片和說明。

我的困難是,colorPickerView打開並選中數據「Blue」,就像sizerPickerView默認打開數據「Small」一樣。我希望pickerView在用戶觸摸已經選擇的數據時關閉/隱藏。

+1

歡迎來到SO。 **我們在這裏幫助您解決問題或幫助您提供的代碼。如果您無法提供代碼,則任何人都無法提供幫助。**請採取[導覽](https://stackoverflow.com/help)並閱讀[幫助中心](https://stackoverflow.com) /幫助)如何發佈問題。 – Syfer

+0

假設您在說'行'時正在討論UITableViewCell。因此,要在這裏解決您的問題,您可以在該行的contentView上添加點按手勢或使用'didDeselectRowAtIndexPath'委託方法。無論如何,你的問題仍然非常廣泛,所以我希望我說得對。 –

+1

你可以將它隱藏在didSelectRowAtIndexPath方法中 –

回答

1

順應類UIGestureRecognizerDelegate協議

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, UIGestureRecognizerDelegate { 
    // ... 
} 

添加UITapGestureRecognizercolorPickerView

let tap = UITapGestureRecognizer(target: self, action: #selector(self.tapAction(_:))) 
tap.cancelsTouchesInView = false 
tap.delegate = self 
colorPickerView.addGestureRecognizer(tap) 

實現UIGestureRecognizerDelegate方法

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
    return true 
} 

最後落實tapAction

func tapAction(_ tapRecognizer:UITapGestureRecognizer) { 
    if tapRecognizer.state == .ended { 
     let rowHeight : CGFloat = colorPickerView.rowSize(forComponent: 0).height 
     let selectedRowFrame: CGRect = colorPickerView.bounds.insetBy(dx: 0.0, dy: (colorPickerView.frame.height - rowHeight)/2.0) 
     let userTappedOnSelectedRow = selectedRowFrame.contains(tapRecognizer.location(in: colorPickerView)) 
     if (userTappedOnSelectedRow){ 
      let selectedRow = colorPickerView.selectedRow(inComponent: 0) 
      //do whatever you want here 
     } 
    } 
} 

使用sizerPickerView複製步驟2和4以擴展功能。

+0

我這樣做了,但編譯器返回了一些錯誤。 [錯誤](https://i.stack.imgur.com/mycpK.png) [Code Line 1](https://i.stack.imgur.com/RCvhE.png) [Code Line 2 ](https://i.stack.imgur.com/Rz4oA.png) 我剛換掉了barraPickerView的colorPickerView,因爲它是真實的名字。 –

+0

我看到我在做什麼錯了,非常感謝你,它的工作完美。 –