ios - 将数组声明为类的属性并在 Swift 中使用它

标签 ios swift xcode

我有一个 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/

相关文章:

ios - UIView 框架大小未在 UITableViewCell 中更新(使用约束)

ios - 我的导航 Controller 数量不断增加

ios - 删除应用程序后,我创建的内存路径和其中的数据会发生什么变化?

swift - NSAttributedString 到 HTML 到 NSAttributedString 颜色退化

ios - 线程 1 : Signal SIGABRT sprite kit

ios - 如何避免 iOS/Swift tableView 中的重复 subview

iphone - 在 UICollectionView 上动态设置布局会导致莫名其妙的 contentOffset 变化

ios - 是否可以为 UIEdgeInsets 设置动画?

ios - 如何在 Swift 中获取 DatePicker 时间到 Calendar 组件并插入到 Label 组件

swift - 向我的移动应用程序调用我自己的 API