Multiple separate Pickerviews in Swift - ios

I am new to programming, so please forgive the basic nature of this question.
I am trying to put multiple picker views into the same class, but they keep coming back with the same choices.
class ViewController: UIViewController, UIPickerViewDelegate{
#IBOutlet var outgoing: UIPickerView!
var var1=["1","2"]
var var2=["a","b"]
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func numberOfComponentsInPickerView(pickerView: UIPickerView!) ->Int{
return 2
}
func pickerView(pickerView: UIPickerView!, numberOfRowsInComponent component: Int) ->Int {
return var1.count
}
func pickerView(pickerView: UIPickerView!, titleForRow row: Int, forComponent component: Int)->String!{
return var2[row]
}
Any suggestions?

For displaying two components you need to change your methods like:
func numberOfComponentsInPickerView(pickerView: UIPickerView!) ->Int
{
return 2
}
func pickerView(pickerView: UIPickerView!, numberOfRowsInComponent component: Int) ->Int
{
var rows = var2.count
if component == 0
{
rows = var1.count
}
return rows;
}
func pickerView(pickerView: UIPickerView!, titleForRow row: Int, forComponent component: Int)->String!
{
var componentStr = var2[row]
if component == 0
{
componentStr = var1[row]
}
return componentStr;
}

Related

Invalid redeclaration of 'numberOfComponents(in:)' error

Here's my code. I would say the steps I have taken, but they just don't make sense and I'd get made fun of, I am very new to Swift and Xcode. But how do I declare a group of components? I thought I spaced them enough, I have honestly searched for guides, but no one really focuses on dropdowns and variables within the dropdowns.
import UIKit
class SecondViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
#IBOutlet weak var backBTN: UIButton!
#IBOutlet weak var label: UILabel!
#IBOutlet weak var labelTwo: UILabel!
#IBOutlet weak var pickerView: UIPickerView!
#IBOutlet weak var pickerviewTwo: UIPickerView!
var pickerData = ["X", "Y"]
var pickerdataTwo = ["R","D","C"]
override func viewDidLoad() {
super.viewDidLoad()
pickerView.delegate = self
pickerView.dataSource = self
pickerviewTwo.delegate = self
pickerviewTwo.dataSource = self
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return pickerData.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return pickerData[row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
label.text = pickerData[row]
}
func numberOfComponents(in pickerviewTwo: UIPickerView) -> Int {
return 1
}
func pickerviewTwo(_ pickerviewTwo: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return pickerdataTwo.count
}
func pickerviewTwo(_ pickerviewTwo: UIPickerView, titleForRow row: Int, forComponent
component: Int) -> String? {
return pickerdataTwo[row]
}
func pickerviewTwo(_ pickerviewTwo: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
labelTwo.text = pickerdataTwo[row]
}
}
Your picker view code is wrong. First, I would recommend changing the names of them from pickerView and pickerViewTwo to something more descriptive.
The required functions for picker view can't be used multiple times, thus you are getting the error. The proper way to do it is:
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent
component: Int) -> String? {
//After renaming the first pickerView to topPickerView
if pickerView == topPickerView {
return pickerData[row]
}
else {
return pickerDataTwo[row]
}
}
There should be an if-else in each of the required functions, with the if statement saying that if pickerView == oneOfThePickerViewsName, with the if else statement. Whats happening is when the pickers are being set up, it checks which picker it is and uses the code for that.
Here is how the rest should be formatted:
//pickerView has been renamed to topPickerView
func numberOfComponents(in pickerView: UIPickerView) -> Int {
//You wouldn't need to do this here as its the same for both of them.
//
if pickerView == topPickerView
{
return 1
}
else
{
return 1
}
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if pickerView == topPickerView
{
return pickerData.count
}
else
{
return pickerdataTwo.count
// should actually be formatted pickerDataTwo because of camelCase.
}
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent
component: Int) -> String? {
if pickerView == topPickerView
{
return pickerData[row]
}
else
{
return pickerdataTwo[row]
// should actually be formatted pickerDataTwo because of camelCase.
}
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent
component: Int) {
if pickerView == topPickerView
{
label.text = pickerData[row]
}
else
{
labelTwo.text = pickerdataTwo[row]
// should actually be formatted pickerDataTwo because of camelCase.
}
}

How to set title for row in PickerView in Swift 3?

I need to give title for rows according to array but I don't know how to do this. I'm new to iOS.
class ViewController: UIViewController , UIPickerViewDelegate, UIPickerViewDataSource{
#IBOutlet weak var pickerView: UIPickerView!
#IBOutlet weak var label: UILabel!
var names: Array<String>?
var department: Array<String>?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
names = ["Vineeta", "Shubham" ,"Anand", "Vivek", "Akshay", "Harshit", "Vikas", "Prasoon", "Sunil"]
department = ["iOS","Angular", ".Net", "iOS","iOS", ".Net", "Android","Android", "Angular"]
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 2
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return 9
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if component == 0 {
[names o]
}
}
}
don't forget UIPickerViewDelegate,UIPickerViewDataSource
#IBOutlet weak var picker: UIPickerView!
override func viewDidLoad() {
super.viewDidLoad()
pickerData = ["X","Y"]
picker.delegate = self
picker.dataSource = self
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return pickerData.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return pickerData[row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
let selectedText = pickerData[row]
}
Use this code -
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
{
if component == 0
{
return names?.count
}
else
{
return department?.count
}
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
{
if component == 0
{
return names?[row]
}
else
{
return department?[row]
}
}

UIPickerView only show questionmarks [duplicate]

This question already has an answer here:
list of countries into uipickerview swift 3
(1 answer)
Closed 6 years ago.
When I us the following code is only see question marks in the PickerView.
I can't find the mistake.
import UIKit
class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {
#IBOutlet weak var dbPicker: UIPickerView!
var dbPickerData: [String] = [String]()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
//Connect Data:
self.dbPicker.dataSource = self
self.dbPicker.delegate = self
// Fill dbPicker content
dbPickerData = ["White","Red","Green","Blue"]
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// The number of columns of data
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1;
}
// The number of rows of data
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return dbPickerData.count;
}
// The data to return for the row and component (column) that's being passed in
private func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return dbPickerData[row];
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
{
if(row == 0)
{
self.view.backgroundColor = UIColor.white;
}
else if(row == 1)
{
self.view.backgroundColor = UIColor.red;
}
else if(row == 2)
{
self.view.backgroundColor = UIColor.green;
}
else
{
self.view.backgroundColor = UIColor.blue;
}
}
}
Instead of this
private func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return dbPickerData[row];
}
update it with this one
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
let str: String = dbPickerData[row]
return str
}
Hopes it will help...

Does not conform to protocol UIPickerViewDataSource

I don't know what's wrong with my code. I tried to follow the tutorial but same error happen.
Error:
Type 'FourthViewController' does not conform to protocol 'UIPickerViewDataSource'
Here is my code:
import UIKit
let characters = ["Jaja Bink", "Luke", "Han Solo", "Princess Leia"];
let weapons = ["LightSaber", "Pistol", "Keris"];
class FourthViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {
#IBOutlet weak var doublePicker: UIPickerView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return 2
}
func pickerView(pickerView: UIPickerView,
titleForRow row: Int,
forComponent component: Int) -> String? {
if component == 0 {
return characters[row]
} else {
return weapons[row]
}
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int? {
if component == 0 {
return characters.count
} else {
return weapons.count
}
}
}
Replacing deprecated version of the method of protocol UIPickerViewDataSource, if you're using Swift 3 could works for you.
Deprecated Method of Protocol
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return 1
}
Latest Method of Protocol in Swift 3
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
Note: Same true for other required protocol methods.
i.e
Deprecated:
func pickerView(pickerView: UIPickerView!, numberOfRowsInComponent component: Int) -> Int
Recent Version:
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
Because your required delegate method is not correct.
Replace it with this:
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if component == 0 {
return characters.count
} else {
return weapons.count
}
}
Your delegate method returns Int? which is not correct.
You have to implement it's function:
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int

Type 'x' does not conform to protocol 'UIPickerViewDataSource'

import UIKit
class FourthViewController: UIViewController,UIPickerViewDelegate,UIPickerViewDataSource {
#IBOutlet weak var picker: UIPickerView!
var pickerData: [String] = [String]()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.picker.delegate = self
self.picker.dataSource = self
pickerData = ["Item 1", "Item 2", "Item 3", "Item 4", "Item 5", "Item 6"] }
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
//MARK: - Delegates and data sources
//MARK: Data Sources
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return pickerData.count
}
//MARK: Delegates
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return pickerData[row]
}
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
}
*/
}
Error:Type 'FourthViewController' does not conform to protocol
'UIPickerViewDataSource'
Just for testing some features but i dont get the problem
As you have found, you need to implement numberOfComponents(in:).
Your numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int, needs to be changed to:
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
Also you need to modify your pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?:
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return pickerData[row]
}
In Swift 3 many methods are renamed. Check the latest reference, and be careful about this. And you better remark Xcode version in your question.
You must conform data source protocol:
public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
Try this code:
//MARK: - Delegates and data sources
//MARK: Data Sources
public func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return pickerData.count
}
//MARK: Delegate
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return pickerData[row]
}
You have to implement all the required methods of UIPickerViewDataSource and UIPickerViewDelegate if you confirming that protocol in swift. otherwise it will give error at compile time.
I got error due to the delegate method
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int
{
if pickerView == stylePickerView {
return 1 }
else if pickerView == fontPickerView {
return 1 }
return 0
}
tried this instead and worked
#available(iOS 2.0, *)
public func numberOfComponents(in pickerView: UIPickerView) -> Int {
if pickerView == stylePickerView {
return 1 }
else if pickerView == fontPickerView {
return 1 }
return 0
}
You are missing this from the delegate:
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}

Resources