我有一个 cooking 应用程序,我在其中用名称和 cooking 步骤来用餐,它们以字符串数组的形式呈现:
class Meal {
var name: String
var steps: Array<String>?
}
然后我尝试将数据传递给 View :
override func viewDidLoad() {
super.viewDidLoad()
// Handle the text field’s user input through delegate callbacks.
nameTextField.delegate = self
// Set up views if editing an existing Meal.
if let meal = meal {
nameTextField.text = meal.name
}
createLabelAndText()
}
createLabelAndText
方法应该为数组的每个元素创建 label
- 类似于第 1 步、第 2 步和 textView
func createLabel() {
for (index, element) in (meal?.steps){
let myLabel = UILabel()
//Assigning value or text to label
myLabel.text = "Step \(index)"
//Assigning frame to the label
myLabel.frame = CGRect(x: 10, y: index*100, width: 200, height: 30)
let textView = UITextView()
textView.text = element
textView.frame = CGRect(x: 10, y: index*100, width: 200, height: 30)
//Finally we need to add label to view to display it on screen.
self.view.addSubview(myLabel)
self.view.addSubview(textView)
}
}
而我想要得到的是这样的: [ http://a1.mzstatic.com/us/r30/Purple30/v4/24/3e/64/243e64b5-79cf-9a35-5386-d81ed250b926/screen696x696.jpeg][1]
现在我有一个问题 - 我无法通过 meal?.steps
循环并得到错误 Type '[Any]?'不符合协议(protocol)“序列”
我还尝试在呈现之前配置 View Controller 。但它不允许我访问和分配类用餐的步骤。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
super.prepare(for: segue, sender: sender)
let name = nameTextField.text ?? ""
let steps = meal?.steps
// Set the meal to be passed to MealTableViewController after the unwind segue.
meal = Meal(name: name, steps: steps )
}
我该如何解决这个问题或者是否有更好的方法?
最佳答案
您需要打开steps
,因为不仅meal
是可选的,而且steps
也是可选的。例如
func createLabel() {
guard let steps = meal?.steps else { return }
for (index, element) in steps.enumerated() {
let label = UILabel()
//Assigning value or text to label
label.text = "Step \(index)"
//Assigning frame to the label
label.frame = CGRect(x: 10, y: index*100, width: 200, height: 30)
let textView = UITextView()
textView.text = element
textView.frame = CGRect(x: 10, y: index*100, width: 200, height: 30)
//Finally we need to add label to view to display it on screen.
view.addSubview(label)
view.addSubview(textView)
}
}
显然,如果您希望通过 steps
枚举时的 index
,您也需要使用 enumerated()
。
顺便说一句,我不确定为什么要将 TextView 设置为与标签具有相同的 frame
,有效地将其放在标签的顶部,但这超出了范围这个问题。这里的主要问题只是确保在尝试使用它之前解开 steps
可选。
关于ios - 将数组声明为类的属性并在 Swift 中使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53381708/