首页 > 解决方案 > SWIFT 将参数从 VC 传递到 UIView 让我抓狂

问题描述

从昨天开始,我一直在努力完成这项工作,但没有一种方法是成功的。虽然我学到了很多东西,但似乎仍然缺少一些基础知识。

我有一个视图控制器,它应在堆栈中包含几个子视图。每个子视图应在单独的 swift 文件中使用相同的 UIView 类。但是,对于每个子视图,我想将位置 ID 传递给 UIView 类。控制器和子视图是使用情节提要创建的。

所以我最新最好的方法是

class SpatialViewController: UIViewController {
   @IBOutlet var redSquare: SpatialProblemView!
   @IBOutlet var blueSquare: SpatialProblemView!

   override func viewDidLoad() {
       super.viewDidLoad()
   
       redSquare = SpatialProblemView(subviewName: "red")
       blueSquare = SpatialProblemView(subviewName: "blue")
   //  redSquare.subviewName = "red"
    
       self.view.addSubview(redSquare)
   }
}

class SpatialProblemView: UIView {
   var subviewName: String

   init(subviewName: String){
       self.subviewName = subviewName
       super.init(frame: CGRect.zero)
   }
   required init?(coder aDecoder: NSCoder) {
       super.init(coder: aDecoder)
   }
}

我也试过用这个对 UIView 进行编码

required init(subviewName: String) {
    super.init(frame: .zero)
    self.subviewName = subviewName
    self.setup()
}

required override init(frame: CGRect) {
    super.init(frame: frame)
    self.setup()
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    self.setup()

func setup() {
    if subviewName == "red" {
        print ("red")
    }
}

但这似乎与正在运行的代码相去甚远。使用上面的UIView 定义,我收到错误Fatal error: init(coder:) has not been implemented in the console and Property 'self.subviewName' not initialized at super.init call inline 在编辑器中。两者都与

super.init(coder: aDecoder)

我已经在这里寻找其他带有此错误消息的帖子,但我看到的没有一个对我有帮助。非常感谢任何帮助:-)

标签: iosswiftuiviewuiviewcontroller

解决方案


尝试使其成为可选

 var subviewName: String?

如果你把它们作为插座,那么你不应该在这里分配一个新的实例

SpatialProblemView(subviewName: "red")

只需分配属性

redSquare.subviewName = "red"

推荐阅读