0

У меня есть три Pickerview, как показано на изображении ниже. Я главный pickerview, left pickerview и правильный выбор.Что касается множественного UIPickerview

В массиве main pickerview имеется группа имен, и каждое имя имеет группу единиц. Я сделал массив внутри массива, чтобы показать им, где он принадлежит. Но я не мог этого сделать. Массив для основного pivkerview появляется как в первом, так и в левом углу.

enter image description here

вот мой код:

import UIKit 

класс ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate, UITextFieldDelegate {

@IBOutlet weak var mainPicker: UIPickerView! 
@IBOutlet weak var leftPicker: UIPickerView! 
@IBOutlet weak var rightPicker: UIPickerView! 
@IBOutlet weak var textFieldLeft: UITextField! 
@IBOutlet weak var textFielfRight: UITextField! 
@IBOutlet weak var equal: UILabel! 

var mainPickerData = [] 
var leftPickerData = [] 
var rightPickerData = [] 

//yourPicker.backgroundColor = UIColor(patternImage: UIImage(named: "back.jpg")!) 


override func viewDidLoad() { 
    super.viewDidLoad() 

    // Connect data: 
    self.mainPicker.delegate = self 
    self.mainPicker.dataSource = self 

    self.leftPicker.delegate = self 
    self.leftPicker.dataSource = self 

    self.rightPicker.delegate = self 
    self.rightPicker.dataSource = self 

    let theWidth = view.frame.size.width 
    let theHeight = view.frame.size.height 

    mainPicker.center = CGPointMake(theWidth/2, theHeight/2 - 182.5) 
    leftPicker.center = CGPointMake(theWidth/2 - 100, theHeight/2) 
    rightPicker.center = CGPointMake(theWidth/2 + 100, theHeight/2) 
    textFieldLeft.center = CGPointMake(theWidth/2 - 90, theHeight/2 + 110) 
    textFielfRight.center = CGPointMake(theWidth/2 + 90, theHeight/2 + 110) 
    equal.center = CGPointMake(theWidth/2, theHeight/2 + 110) 



    let Area = ["Square Mile", "Square Yard", "Square Foot", "Square Inch", "Hectare", "Acre", "Square Kilometer", "Square Meter", "Square Centimeter", " Square Millimeter"] 

    let Energy = ["Btus", "Calories", "Ergs", "Foot-Pounds", "Joules", "Kilogram-Calories", "Kilogram-Meters", "Kilowatt-Hours", "Newton-Meters", "Watt-Hours"] 

    let Length = ["Mile", "Yard", "Foot", "Inch", "Kilometer", "Meter", "Centimeter", "Millimeter"] 

    let Power = ["Btus/Minute", "Foot-Pounds/Min", "Foot-Pounds/Sec", "Horsepower", "Kilowatts", "Watts"] 

    let Pressure = ["Pounds/Sqr Ft", "Pounds/Sqr In", "Atmospheres", "Bars", "In of Mercury", "Cm of Mercury", "Kilograms/Sqr Meter", "Pascals"] 

    let Speed = ["Knots", "Miles/Hr", "Miles/Min", "Feet/Min", "Feet/Sec", "Kilometers/Hr", "Kilometer/Min", "Meters/Sec"] 

    let Temperature = ["Celsius C˚", "Fahrenheit", "Kelvin"] 

    let Time = ["Years", "Months", "Weeks", "Days", "Hours", "Minutes", "Seconds", "Millisconds", "Microseconds", " Nanoseconds"] 

    let Volume = ["Cupic Feet","Cubic Meter", "Gallon (Imp)", "Gallon (US)", "Quart (US)", "Pint (US)", "Fluid Oz", "Cup", "Tablespoon", "Teaspoon", "Dram (US)", "Liter"] 

    let Weight = ["Short Ton (US)","Long Ton (UK)", "Pound (U.S)", "Ounce (US)", "Stone", "Metric Ton", "Kilogram", "Gram"] 

    // Pickerview at the center top side of Screen. 
    mainPickerData = ["Area", "Energy", "Length", "Power", "Pressure", "Speed", "Temperature", "Time", "Volume", "Weight"] 

    // Pickerview at the lower left side of Screen. 
    leftPickerData = [["Square Mile", "Square Yard", "Square Foot", "Square Inch", "Hectare", "Acre", "Square Kilometer", "Square Meter", "Square Centimeter", " Square Millimeter"], ["Square Mile", "Square Yard", "Square Foot", "Square Inch", "Hectare", "Acre", "Square Kilometer", "Square Meter", "Square Centimeter", " Square Millimeter"], ["Mile", "Yard", "Foot", "Inch", "Kilometer", "Meter", "Centimeter", "Millimeter"], ["Btus/Minute", "Foot-Pounds/Min", "Foot-Pounds/Sec", "Horsepower", "Kilowatts", "Watts"], ["Pounds/Sqr Ft", "Pounds/Sqr In", "Atmospheres", "Bars", "In of Mercury", "Cm of Mercury", "Kilograms/Sqr Meter", "Pascals"], ["Knots", "Miles/Hr", "Miles/Min", "Feet/Min", "Feet/Sec", "Kilometers/Hr", "Kilometer/Min", "Meters/Sec"],["Celsius C˚", "Fahrenheit", "Kelvin"], ["Years", "Months", "Weeks", "Days", "Hours", "Minutes", "Seconds", "Millisconds", "Microseconds", " Nanoseconds"], ["Cupic Feet","Cubic Meter", "Gallon (Imp)", "Gallon (US)", "Quart (US)", "Pint (US)", "Fluid Oz", "Cup", "Tablespoon", "Teaspoon", "Dram (US)", "Liter"], ["Short Ton (US)","Long Ton (UK)", "Pound (U.S)", "Ounce (US)", "Stone", "Metric Ton", "Kilogram", "Gram"]] 

    // Pickerview at the lower Right side of Screen. 
    rightPickerData = [["Square Mile", "Square Yard", "Square Foot", "Square Inch", "Hectare", "Acre", "Square Kilometer", "Square Meter", "Square Centimeter", " Square Millimeter"], ["Square Mile", "Square Yard", "Square Foot", "Square Inch", "Hectare", "Acre", "Square Kilometer", "Square Meter", "Square Centimeter", " Square Millimeter"], ["Mile", "Yard", "Foot", "Inch", "Kilometer", "Meter", "Centimeter", "Millimeter"], ["Btus/Minute", "Foot-Pounds/Min", "Foot-Pounds/Sec", "Horsepower", "Kilowatts", "Watts"], ["Pounds/Sqr Ft", "Pounds/Sqr In", "Atmospheres", "Bars", "In of Mercury", "Cm of Mercury", "Kilograms/Sqr Meter", "Pascals"], ["Knots", "Miles/Hr", "Miles/Min", "Feet/Min", "Feet/Sec", "Kilometers/Hr", "Kilometer/Min", "Meters/Sec"],["Celsius C˚", "Fahrenheit", "Kelvin"], ["Years", "Months", "Weeks", "Days", "Hours", "Minutes", "Seconds", "Millisconds", "Microseconds", " Nanoseconds"], ["Cupic Feet","Cubic Meter", "Gallon (Imp)", "Gallon (US)", "Quart (US)", "Pint (US)", "Fluid Oz", "Cup", "Tablespoon", "Teaspoon", "Dram (US)", "Liter"], ["Short Ton (US)","Long Ton (UK)", "Pound (U.S)", "Ounce (US)", "Stone", "Metric Ton", "Kilogram", "Gram"]] 
} 

// The number of columns of data 
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { 
    return 1 
} 

// The number of rows of data 
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 

    if mainPicker.tag == 1 { 

     return mainPickerData.count 

    }else if leftPicker.tag == 2 { 

     return leftPickerData.count 

    }else{ 

     return rightPickerData.count 
    } 
} 

// The data to return for the row and component (column) that's being passed in 
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 

    if mainPicker.tag == 1 { 

     return mainPickerData[row] as? String 
    }else if leftPicker.tag == 2 { 

     return leftPickerData[row] as? String 

    }else{ 

     return rightPickerData[row] as? String 
    } 


} 

// Catpure the picker view selection 
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
    // This method is triggered whenever the user makes a change to the picker selection. 
    // The parameter named row and component represents what was selected. 
} 

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    self.view.endEditing(true) 

} 

func pickerView(pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? { 
    let titleData = mainPickerData[row] 
    let myTitle = NSAttributedString(string: titleData as! String, attributes: [NSFontAttributeName:UIFont(name: "Georgia", size: 15.0)!,NSForegroundColorAttributeName:UIColor.blueColor()]) 
    return myTitle 
} 

}

ответ

0

Вместо того, чтобы в Array, Создайте a Dictionary для вас основной источник данных, как этот, и используйте его правильно, чтобы получить numberOfRowsInComponent count и titleForRow.

let dataDict:NSMutableDictionary = ["Area":["Square Mile", "Square Yard", "Square Foot", "Square Inch", "Hectare", "Acre", "Square Kilometer", "Square Meter", "Square Centimeter", " Square Millimeter"] 
     ,"Energy":["Btus", "Calories", "Ergs", "Foot-Pounds", "Joules", "Kilogram-Calories", "Kilogram-Meters", "Kilowatt-Hours", "Newton-Meters", "Watt-Hours"]] 
let mainPickerData = dataDict.allKeys; 
let leftPickerData = dataDict.objectForKey("Energy"); //here you can pas the string return from pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) delegate for main picker 

print(mainPickerData); 
print(leftPickerData); 

Если вы ушли и правый сборщик должен содержать одни и те же данные, для этого вы можете использовать один источник данных.

Также в делегате func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?

не проверять бирку на вашем экземпляре сборщика, если вы уже установили тег для сборщиков, а затем использовать pickerView объект в сигнатуре методы для проверки tag.Do так ли как этого

if pickerView.tag == 1 {...} 
else if (pickerView.tag == 2) {...} 

причина, по которой данные показаны же во все подборщике является то, что в вашем func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? условие всегда истинно. то есть mainPicker.tag == 1, если вы установили тег 1 для mainPicker, следовательно, он возвращает те же данные для всех сборщиков.

ОБНОВЛЕНО РЕШЕНИЕ

// The number of columns of data 
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { 
    return 1 
} 

// The number of rows of data 
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 

    switch (pickerView.tag) { 

    case mainPicker.tag: 

     return mainPickerData.count 

    case leftPicker.tag,rightPicker.tag: 

     let currentSelectedIndex = mainPicker.selectedRowInComponent(0) 
     leftRightPickerData = (dataDict.objectForKey(mainPickerData[currentSelectedIndex] as! String) as! NSArray) 

     return leftRightPickerData.count; 

    default: 
     break; 
    } 
    return 0; 
}//F.E 

// The data to return for the row and component (column) that's being passed in 
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 

    switch (pickerView.tag) { 

    case mainPicker.tag: 

     return mainPickerData[row] as? String; 

    case leftPicker.tag,rightPicker.tag: 

     let currentSelectedIndex = mainPicker.selectedRowInComponent(0) 
     leftRightPickerData = (dataDict.objectForKey(mainPickerData[currentSelectedIndex] as! String) as! NSArray) 

     return leftRightPickerData[row] as? String; 

    default: 
     break; 
    } 

    return ""; 

} 

// Catpure the picker view selection 
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
    // This method is triggered whenever the user makes a change to the picker selection. 
    // The parameter named row and component represents what was selected. 
    if(pickerView.tag == 1){ 

     let currentSelectedIndex = mainPicker.selectedRowInComponent(0) 
     leftRightPickerData = (dataDict.objectForKey(mainPickerData[currentSelectedIndex] as! String) as! NSArray) 

     leftPicker.reloadAllComponents(); 
     rightPicker.reloadAllComponents(); 
    } 
} 

Выше реализация для вашего UIPickerViewdelegate и datasource. Напишите следующий код в viewDidLoad()

dataDict = ["Area":["Square Mile", "Square Yard", "Square Foot", "Square Inch", "Hectare", "Acre", "Square Kilometer", "Square Meter", "Square Centimeter", " Square Millimeter"] 
     ,"Energy":["Btus", "Calories", "Ergs", "Foot-Pounds", "Joules", "Kilogram-Calories", "Kilogram-Meters", "Kilowatt-Hours", "Newton-Meters", "Watt-Hours"]] 
    mainPickerData = dataDict.allKeys; 
    leftRightPickerData = dataDict.objectForKey(mainPickerData.firstObject as! String) as! NSArray 

Я просто добавил 2 ключа пары значений для вашего кода /, вы можете добавить остальные значения в dataDict.

Вставьте следующий код в вашем классе, прежде чем viewDidLoad()

var dataDict:NSMutableDictionary! 
var mainPickerData:NSArray! 
var leftRightPickerData:NSArray! 
+0

Да ты в порядке по отношению к левой и правой pickerview, они полагают, имеют одни и те же данные. Извините, у меня есть некоторые вопросы для вас ... 1- Как я могу поделиться данными и делегировать между левым и правым выбором. Должен ли я удалить делегата и источники из mainpickerview. 2- let leftPickerData = dataDict.objectForKey («Энергия»); Что касается других групп, как добавить их в одну переменную.и буду ли я делать то же самое по праву? 3- –

+0

для вашего последнего комментария относительно тега, что мне делать. В настоящее время ничто не появляется ни в одном из них. –

+0

Проверяйте мой обновленный ответ, надейтесь, что он решит вашу проблему, и в строке изменения в вашем главном окне выбора будет соответственно обновлено изображение слева и справа. – Muneeba