Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在多个PickerView中实现功能的建议?_Ios_Swift - Fatal编程技术网

Ios 在多个PickerView中实现功能的建议?

Ios 在多个PickerView中实现功能的建议?,ios,swift,Ios,Swift,我在XCode中遇到了一些死胡同,非常感谢您的帮助: 我正试图为我爸爸设计一个应用程序,根据我将在pickerViews中建立的值,计算不同肉块的压力烹饪时间 虽然我已经掌握了实现开关命令的诀窍,可以在四个不同的选择器视图中显示不同的信息字符串,对应于四种肉类类型(牛肉、猪肉、羊肉和家禽),但我很难弄清楚如何将这些信息真正传给……嗯,实际上充当任何有意义的输入 我一直在遵循《终极ios 10,XCode指南:构建30个应用程序》一书中为加拿大税务计算器编写的示例指南,因为尽管最终游戏与我所追求的

我在XCode中遇到了一些死胡同,非常感谢您的帮助:

我正试图为我爸爸设计一个应用程序,根据我将在pickerViews中建立的值,计算不同肉块的压力烹饪时间

虽然我已经掌握了实现开关命令的诀窍,可以在四个不同的选择器视图中显示不同的信息字符串,对应于四种肉类类型(牛肉、猪肉、羊肉和家禽),但我很难弄清楚如何将这些信息真正传给……嗯,实际上充当任何有意义的输入

我一直在遵循《终极ios 10,XCode指南:构建30个应用程序》一书中为加拿大税务计算器编写的示例指南,因为尽管最终游戏与我所追求的功能不一样,但在实现了四个选择器功能后,如下所述:

  func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    switch Beefpicker.tag {
    case 1:
        return listofBeef.count
    case 2:
        return listofPork.count
    case 3:
        return listofLamb.count
    case 4:
        return listofPoultry.count
        
    default:
        break
    }
}


func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    switch Beefpicker.tag {
    case 1:
        return listofBeef[row]
    case 2:
        return listofPork[row]
    case 3:
        return listofLamb[row]
    case 4:
        return listofPoultry[row]
    
    
    default:
        break
        
它涉及到didSelectRow函数,据我所知,它是将值作为整体“计算”的一个因素的实际关键。但我在这里遇到的问题是,使其作用于所有四个选择器,而不仅仅是一个选择器。它一直在说代码永远不会被执行,一方面?reddit上也有人建议使用标记功能,如:

 }
    func pickerView(_pickerView: UIPickerView, didSelectRow row: Int,
                    inComponent component: Int) -> Int{
        Beefpicker.tag = 1
        Porkpicker.tag = 2
        Lambpicker.tag = 3
        Poultrypicker.tag = 4
        if Beefpicker.tag = = 1 {}
    }
    }`enter code here`
但我很确定我丢了什么钥匙?去掉if语句会删除实现do语句的错误和建议,但会导致上面的两个大括号“在预期返回‘Int’的函数中缺少返回”

而且……老实说,如果有人能把这一切都说清楚,并更清楚地解释发生了什么,我真的很感激?比如:我做错了什么,导致了什么,我应该如何修复它,为什么会这样

下面是完整的代码,包括一些我声明为“以防万一”的变量,供以后使用(说来话长,但我肯定不需要它们!)

类ViewController:UIViewController、UIPickerViewDeleteGate、UIPickerViewDataSource{

@IBOutlet weak var KGTextfieldbeef: UITextField!
@IBOutlet weak var MINSTextfieldBeef: UITextField!
@IBOutlet weak var KGTextfieldPork:  UITextField!
@IBOutlet weak var MINSTextfieldPork: UITextField!
@IBOutlet weak var KGTextfieldlamb: UITextField!
@IBOutlet weak var MINSTextfieldlamb: UITextField!
@IBOutlet weak var KGTextfieldpoulty: UITextField!
@IBOutlet weak var MINSTextfieldpoultry: UITextField!


@IBOutlet weak var Beefpicker: UIPickerView!

@IBOutlet weak var Porkpicker: UIPickerView!

@IBOutlet weak var Lambpicker: UIPickerView!

@IBOutlet weak var Poultrypicker: UIPickerView!

@IBOutlet weak var btnCalculateButtonbeef: UIButton!
@IBOutlet weak var  btnCalculateButtonpork: UIButton!
@IBOutlet weak var btnCalculateButtonlamb: UIButton!
@IBOutlet weak var btnCalculateButtonpoultry: UIButton!

let Beef = ["Boneless Short Ribs", "Chuck Steak (Cubed)", "Minced Beef (From Frozen)", "Minced Beef", "Burgers (Air-crisp)", "Chuck-Eye Roast", "Beef Brisket", "Steak (Air-Crisp, rare"]

let Pork = ["Bacon (Air-Crisp)", "Sausages (Air-Crisp)", "Boneless Pork Shoulder", "Minced Pork (From Frozen", "Minced Pork", "Pork Tenderloins (Air-crisp)", "Baby Back Pork", "Pork Chops (Boneless, Air Crisp", "Pork Chops (With Bone, Air-Crisp"]

let Lamb = ["Leg of Lamb (Boneless)", "Leg of Lamb", "Lamb Chops (Boneless)", "Lamb Chops", "Lamb Steak", "Minced Lamb"]

let Poultry = ["Chicken Breast (Unfrozen)", "Chicken Breast", "Chicken Thighs", "Chicken Legs", "Chicken Nuggets", "Turkey Breast", "Minced Turkey (Frozen)", "Minced Turkey" ]

var Weight: Double?
var Mins: Double?
var selectedMeat: String?

var listofmeat = ["Minced Beef", "Minced Pork", "Minced Turkey", "Pork Tenderloin", "Sausages (Air-crisp", "Burgers (Air-Crisp)", "Steak (Air-Crisp, rare)", "Chicken Nuggets (Air-Crisp)", "Chicken Breast (Unfrozen", "Chicken Breast (Frozen)", "Chicken Thighs, Bacon (Air-crisp)", "Pork Chops (With Bone", "Air Crisp)","Pork Tenderloins (Air-crisp)", "Baby Back Pork", "Boneless Beef Short Ribs", "Chuck Steak (Cubed)", "Pork Chops (Boneless, Air Crisp)", "Minced Beef (Frozen)", "Minced Pork (Frozen)", "Minced Turkey (Frozen)","Boneless Beef Short Ribs", "Chuck Steak (Cubed)", "Pork Chops (Boneless, Air Crisp)", "Minced Beef (Frozen)", "Minced Pork (Frozen)", "Minced Turkey (Frozen)","Boneless Leg Of Lamb", "Turkey Breast", "Boneless Pork Shoulder", "Beef Brisket"]


var listoffive = ["Minced Beef", "Minced Pork", "Minced Turkey", "Pork Tenderloin,"]

var listoften = ["Sausages (Air-crisp)", "Burgers (Air-Crisp)"," Steak (Air-Crisp, rare)", "Chicken Nuggets (Air-crisp)"]

var listoffifteen = ["Chicken Breast (Unfrozen)", "Chicken Breast (Frozen)", "Chicken Thighs, Bacon (Air-crisp)", "Pork Chops (With Bone", "Air Crisp)"]

var listoftwenty = ["Pork Tenderloins (Air-crisp)", "Baby Back Pork,"]

var listoftwentyfive = ["Boneless Beef Short Ribs", "Chuck Steak (Cubed)", "Pork Chops (Boneless, Air Crisp)", "Minced Beef (Frozen)", "Minced Pork (Frozen)", "Minced Turkey (Frozen)"]

var listofthirty = ["Boneless Leg Of Lamb"]

var listofforty = ["Turkey Breast"]

var listofsixty = ["Beef Chuck-Eye Roast"]

var listofninety = ["Boneless Pork Shoulder", "Beef Brisket"]

var listofBeef: [String] = ["Boneless Short Ribs", "Chuck Steak (Cubed)", "Minced Beef (From Frozen)", "Minced Beef", "Burgers (Air-crisp)", "Chuck-Eye Roast", "Beef Brisket", "Steak (Air-Crisp, rare"]

var listofPork: [String] = ["Bacon (Air-Crisp)", "Sausages (Air-Crisp)", "Boneless Pork Shoulder", "Minced Pork (From Frozen", "Minced Pork", "Pork Tenderloins (Air-crisp)", "Baby Back Pork", "Pork Chops (Boneless, Air Crisp", "Pork Chops (With Bone, Air-Crisp"]

var listofLamb: [String] = ["Leg of Lamb (Boneless)", "Leg of Lamb", "Lamb Chops (Boneless)", "Lamb Chops", "Lamb Steak", "Minced Lamb"]

var listofPoultry: [String] = ["Chicken Breast (Unfrozen)", "Chicken Breast", "Chicken Thighs", "Chicken Legs", "Chicken Nuggets", "Turkey Breast", "Minced Turkey (Frozen)", "Minced Turkey" ]

@IBAction func pressCalculatebuttonbeef(_ sender: UIButton ){}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
}

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    switch Beefpicker.tag {
    case 1:
        return listofBeef.count
    case 2:
        return listofPork.count
    case 3:
        return listofLamb.count
    case 4:
        return listofPoultry.count
        
    default:
        break
    }
}


func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    switch Beefpicker.tag {
    case 1:
        return listofBeef[row]
    case 2:
        return listofPork[row]
    case 3:
        return listofLamb[row]
    case 4:
        return listofPoultry[row]
    
    
    default:
        break
        
    
    }
    func pickerView(_pickerView: UIPickerView, didSelectRow row: Int,
                    inComponent component: Int) -> Int{
        Beefpicker.tag = 1
        Porkpicker.tag = 2
        Lambpicker.tag = 3
        Poultrypicker.tag = 4
      
    }
    }
重写func viewDidLoad(){ super.viewDidLoad()

}

func CalculateandprintTotal()函数{

}


}

这里有一个更简单的解决方案,现在更新为包含待烹调肉类的重量

我创建了一个包含三个
UIPickerView
组件的简单视图,分别名为
pickermat
(带标记=0)、
pickerCut
(带标记=1)和
pickerWeight
(带标记=2),显示标签名为
lblInfo

存储切肉和烹饪时间细节的最简单方法是使用用户定义结构的数组。你可以建立一个类似这样的结构

struct CookingTimes
{
    var cutOfMeat           : String
    var cookingTimePerKg    : Int

    // because we include _ in the initialiser, we don't have to name the parameters when we use it
    init(_ cutOfMeat : String, _ cookingTimePerKg : Int)
    {
        self.cutOfMeat          = cutOfMeat
        self.cookingTimePerKg   = cookingTimePerKg
    }
}
您可以使用一个简单的肉类类型数组和一个烹饪时间数组

let typeOfMeat = ["Beef", "Pork", "Lamb", "Poultry"]
var cutOfMeat = [[CookingTimes]]()
然后可以在
viewDidLoad
中定义切割数据。我已经将时间设置为10、11、12等,以便您可以检查选择是否正确-您需要更新实际值

    // set up the Beef cuts
    cutOfMeat.append([CookingTimes("Boneless Short Ribs", 10),
                      CookingTimes("Chuck Steak (Cubed)", 11),
                      CookingTimes("Minced Beef (From Frozen)", 12),
                      CookingTimes("Minced Beef", 13),
                      CookingTimes("Burgers (Air-crisp)", 14),
                      CookingTimes("Chuck-Eye Roast", 15),
                      CookingTimes("Beef Brisket", 16),
                      CookingTimes("Steak (Air-Crisp, rare", 17)])
    // set up the Pork
    cutOfMeat.append([CookingTimes("Bacon (Air-Crisp)", 20),
                      CookingTimes("Sausages (Air-Crisp)", 21),
                      CookingTimes("Boneless Pork Shoulder", 22),
                      CookingTimes("Minced Pork (From Frozen", 23),
                      CookingTimes("Minced Pork", 24),
                      CookingTimes("Pork Tenderloins (Air-crisp)", 25),
                      CookingTimes("Baby Back Pork", 26),
                      CookingTimes("Pork Chops (Boneless, Air Crisp", 27),
                      CookingTimes("Pork Chops (With Bone, Air-Crisp",28)])
    // setup the Lamb
    cutOfMeat.append([CookingTimes("Leg of Lamb (Boneless)", 31),
                      CookingTimes("Leg of Lamb", 32),
                      CookingTimes("Lamb Chops (Boneless)", 33),
                      CookingTimes("Lamb Chops", 34),
                      CookingTimes("Lamb Steak", 35),
                      CookingTimes("Minced Lamb",36)])
    // setup the Poultry
    cutOfMeat.append([CookingTimes("Chicken Breast (Unfrozen)", 40),
                    CookingTimes("Chicken Breast", 41),
                    CookingTimes("Chicken Thighs", 42),
                    CookingTimes("Chicken Legs", 43),
                    CookingTimes("Chicken Nuggets", 44),
                    CookingTimes("Turkey Breast", 45),
                    CookingTimes("Minced Turkey (Frozen)", 46),
                    CookingTimes("Minced Turkey",47) ])
    
然后,在选择器视图方法中,检查选择器是肉类类型(标记=0)、切割(标记=1)还是重量(标记=2)

然后我用信息更新了
UILabel
,以显示您已经做出了选择,并简单计算了烹饪时间

func calculateAndPrintTotal()
{
    // display timings / recipe based on selection
    // simple assumption that cooking time is time per Kg x weight
    // in practise, the time per Kg may reduce for larger weights,
    // but you could add that in the struct CookingTimeswith something like timePerKG_Under3Kg, timePerKG_Over3Kg
    let meat    = typeOfMeat[typeOfMeatSelected]
    let cut     = cutOfMeat[typeOfMeatSelected][pickerCut.selectedRow(inComponent: 0)].cutOfMeat
    
    let cookingTime = weightSelected * Double(cutOfMeat[typeOfMeatSelected][pickerCut.selectedRow(inComponent: 0)].cookingTimePerKg)

    
    lblInfo.text = "Show details for \(meat), \(cut), \(weightSelected) Kg \n\n Cooking time is \(cookingTime) minutes"

}

你可以简化很多,你真的想在同一时间显示所有类型的肉,还是想选择牛肉、猪肉、羊肉等,然后选择一个切块?你可以用一个选择器显示不同的数据,这取决于你选择的肉的类型。老实说,我把它们放在四个单独的选择器中,在你看到的四个图像标志下,但我绝对愿意通过可选择的图像来改变这一点!我真的很感激你给我的任何建议?哇,谢谢!这是难以置信的帮助和洞察力!那么,这样说吧:既然设置了pickerviews,我应该从哪里开始设置,以便在计算中实现这些值?到目前为止,我已经用switch语句声明了一些函数,比如:case“Boneless Pork seal”,“Beef briket”Mins=90,重量也一样,只有那些值=1——我猜这可能不会让我走得很远,因为90*1仍然是1?(再次感谢你,我真的很感激!)同时,如果我误解了什么,我想道歉:我是孤独症患者,有时我只是需要在事情“点击”之前有一点额外的背景,哈哈。。。但是,再一次,真的很感激@蝙蝠女-很乐意帮忙。我也从中得到了很多:-)如果你喜欢这个答案,请接受它。我将更新答案,以显示一种显示烹饪时间的方式,这将比您建议的简单得多…别担心,我会的!但要明确的是:这也将允许我在计算时更改肉重的值?比如它允许更改用户输入的1KG、2KG等值,让我这样设置计算?或者我需要一个完全不同的代码…?我将添加一个重量选择器,您将被排序:-)
    // set up the Beef cuts
    cutOfMeat.append([CookingTimes("Boneless Short Ribs", 10),
                      CookingTimes("Chuck Steak (Cubed)", 11),
                      CookingTimes("Minced Beef (From Frozen)", 12),
                      CookingTimes("Minced Beef", 13),
                      CookingTimes("Burgers (Air-crisp)", 14),
                      CookingTimes("Chuck-Eye Roast", 15),
                      CookingTimes("Beef Brisket", 16),
                      CookingTimes("Steak (Air-Crisp, rare", 17)])
    // set up the Pork
    cutOfMeat.append([CookingTimes("Bacon (Air-Crisp)", 20),
                      CookingTimes("Sausages (Air-Crisp)", 21),
                      CookingTimes("Boneless Pork Shoulder", 22),
                      CookingTimes("Minced Pork (From Frozen", 23),
                      CookingTimes("Minced Pork", 24),
                      CookingTimes("Pork Tenderloins (Air-crisp)", 25),
                      CookingTimes("Baby Back Pork", 26),
                      CookingTimes("Pork Chops (Boneless, Air Crisp", 27),
                      CookingTimes("Pork Chops (With Bone, Air-Crisp",28)])
    // setup the Lamb
    cutOfMeat.append([CookingTimes("Leg of Lamb (Boneless)", 31),
                      CookingTimes("Leg of Lamb", 32),
                      CookingTimes("Lamb Chops (Boneless)", 33),
                      CookingTimes("Lamb Chops", 34),
                      CookingTimes("Lamb Steak", 35),
                      CookingTimes("Minced Lamb",36)])
    // setup the Poultry
    cutOfMeat.append([CookingTimes("Chicken Breast (Unfrozen)", 40),
                    CookingTimes("Chicken Breast", 41),
                    CookingTimes("Chicken Thighs", 42),
                    CookingTimes("Chicken Legs", 43),
                    CookingTimes("Chicken Nuggets", 44),
                    CookingTimes("Turkey Breast", 45),
                    CookingTimes("Minced Turkey (Frozen)", 46),
                    CookingTimes("Minced Turkey",47) ])
    
extension ViewController: UIPickerViewDelegate, UIPickerViewDataSource
    {
    // PickerView methods
    // the type of meat picker has tag = 0, the cutOfMeat picker is tag = 1, the weight is tag = 2

    func numberOfComponents(in pickerView: UIPickerView) -> Int
    {
        // this is the same for all pickers, so no check required
        return 1
    }

     func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
     {
        //if the type of Meat is selected, change the tracking variable 'typeOfMeatSelected'
        // and refresh the cutofmeat picker
        switch pickerView.tag {
        case 0:
            // type of meat
            typeOfMeatSelected = row
            pickerCut.reloadAllComponents()
            // select the first entry, otherwise you could have a selected row higher then the current type of meat
            pickerCut.selectRow(0, inComponent: 0, animated: true)
        case 1:
            // cut of meat
            // display the calculated timings / recipe
            calculateAndPrintTotal()
        case 2:
            // weight of meat
            weightSelected = weightOfMeat[row]
            // display the calculated timings / recipe
            calculateAndPrintTotal()
        default:
            print("Something is missing if we see this")
        }
     }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
    {
    switch pickerView.tag {
        case 0:
            return typeOfMeat.count

        case 1:
            return cutOfMeat[typeOfMeatSelected].count
    
        case 2:
            return weightOfMeat.count
        default:
            return 0
        }
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
    {
        switch pickerView.tag {
        case 0:
            return typeOfMeat[row]

        case 1:
            return cutOfMeat[typeOfMeatSelected][row].cutOfMeat
    
        case 2:
            return ("\(weightOfMeat[row]) Kg")
        default:
            return "unknown"
        }
    }
}
func calculateAndPrintTotal()
{
    // display timings / recipe based on selection
    // simple assumption that cooking time is time per Kg x weight
    // in practise, the time per Kg may reduce for larger weights,
    // but you could add that in the struct CookingTimeswith something like timePerKG_Under3Kg, timePerKG_Over3Kg
    let meat    = typeOfMeat[typeOfMeatSelected]
    let cut     = cutOfMeat[typeOfMeatSelected][pickerCut.selectedRow(inComponent: 0)].cutOfMeat
    
    let cookingTime = weightSelected * Double(cutOfMeat[typeOfMeatSelected][pickerCut.selectedRow(inComponent: 0)].cookingTimePerKg)

    
    lblInfo.text = "Show details for \(meat), \(cut), \(weightSelected) Kg \n\n Cooking time is \(cookingTime) minutes"

}