Я зашел в тупик в XCode и был бы очень признателен за любую помощь:
Я пытаюсь разработать приложение для своего отца, которое будет рассчитывать время приготовления под давлением для различных кусков мяса на основе значений, которые я собираюсь установить в pickerViews.
Хотя я научился реализовывать команды переключения для отображения разных строк информации в четырех разных представлениях выбора, соответствующих четырем типам мяса (говядина, свинина, баранина и птица), у меня большие проблемы с выяснением того, как на самом деле получить эту информацию, чтобы... ну, на самом деле действовать как любой значимый ввод.
Я следовал примеру руководства из книги «The Ultimate ios 10, XCode Guide: Build 30 apps» для канадского налогового калькулятора, потому что, хотя конечная игра не такая, функции, которые я искал, были представлены, и после реализации четырех функций Picker следующим образом:
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 »».
И... ну, если честно, я был бы очень признателен, если бы кто-нибудь мог просто разобрать все это и объяснить, что происходит, немного яснее? Как в: Что я сделал неправильно, что это вызвало, как я должен это исправить и почему это должно быть именно так?
Вот полный код, включая несколько переменных, которые я объявил как «на всякий случай» на потом (долгая история, но я определенно ожидаю, что они не понадобятся!)
import UIKit
Класс ViewController: UIViewController, UIPickerViewDelegate, 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
}
}
Переопределить функцию viewDidLoad() { super.viewDidLoad()
Beefpicker.delegate = self
Beefpicker.dataSource = self
Porkpicker.delegate = self
Porkpicker.dataSource = self
Lambpicker.delegate = self
Lambpicker.dataSource = self
Poultrypicker.delegate = self
Poultrypicker.dataSource = self
Beefpicker.tag = 1
Porkpicker.tag = 2
Lambpicker.tag = 3
Poultrypicker.tag = 4
}
Func CalculateandprintTotal(){
}
}
Честно говоря, любой способ сработает: у меня они есть в четырех отдельных сборщиках под четырьмя логотипами изображений, которые вы видите, но я определенно открыт для изменения этого с помощью выбираемых изображений! Буду очень признателен за любой совет?
Вот более простое решение, которое теперь обновлено и теперь включает вес мяса, которое нужно приготовить.
Я создал простое представление с тремя компонентами UIPickerView, названными pickerMeat (с тегом = 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
}
}
Вы можете использовать простой массив для типа мяса и массив CookingTimes.
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).
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"
}
}
}
Затем я обновил 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"
}
Вау, спасибо! Это невероятно полезно и познавательно! Итак, исходя из этого: теперь, когда окна выбора настроены, с чего мне начать настройку для внедрения этих значений в расчет? До сих пор я объявлял функции с операторами switch, такими как: case "Свиная лопатка без костей", "Говяжья грудинка" Mins = 90 и то же самое для Weight, только эти значения = 1 - я предполагаю, что это может меня не очень заинтересовать. далеко, учитывая, что 90 * 1 все равно будет 1? (Еще раз большое спасибо за это, я очень ценю это!)
Кроме того, я просто хотел извиниться, если я что-то неправильно понял: я аутист, и иногда мне просто нужно немного дополнительного контекста, прежде чем что-то «щелкнет», ха-ха... Но опять же, очень ценю это!!
@Batgirl - рада помочь. Я тоже многое получаю от этого :-) Если вам нравится ответ, пожалуйста, примите его. Я обновлю ответ, чтобы показать один из способов показать время приготовления, это будет намного проще, чем то, что вы предлагаете...
Не волнуйся, я буду! Но просто для ясности: это также позволит мне изменить значение веса мяса, когда дело доходит до расчета? Например, это позволит изменять введенные пользователем значения 1 кг, 2 кг и т. д. И позволить мне настроить расчет таким образом? Или мне нужен совершенно другой код...?
Добавлю подборщик по весу, и будет вам сортировка :-)
Спасибо! Просто быстрый вопрос, мой XCode, похоже, не принимает команду .append? Он не может найти это в области видимости? Я воспринимаю вещи безбожно буквально до ошибки, поэтому я предполагаю, что я не просто пытаюсь скопировать и вставить сюда вещи (как это правильно, мне нужно учиться самому!) Это также не распознает свой собственный контроллер представления, но ... я понятия не имею, просто ли это файл вызывает истерику, потому что это произошло несколько раз и исправилось ...
Странно - я думаю, вы, вероятно, пропустили что-то постороннее, что сбивает синтаксический анализ файла. Я загрузил свои тестовые файлы на GitHub — вы можете посмотреть там полный проект, чтобы увидеть, как все это работает вместе github.com/CarterMiller/PickerViewTest
Ой, спасибо большое, это невероятно полезно!! Серьезно, я не могу передать вам, как я благодарен за ваше время и усилия!
Вы можете значительно упростить это — вы действительно хотите отображать все виды мяса одновременно или хотите выбрать говядину, свинину, баранину и т. д., а затем выбрать нарезку? У вас может быть один сборщик, который показывает разные данные в зависимости от того, какой тип мяса вы выбираете.