Saya mencoba menyelesaikan ini sejak kemarin, tetapi tidak ada pendekatan yang berhasil. Sementara saya telah belajar banyak, beberapa dasar tampaknya masih hilang.

Saya memiliki pengontrol tampilan yang akan berisi beberapa subview dalam tumpukan. Setiap subview harus menggunakan kelas UIView yang sama dalam file Swift yang terpisah. Namun, untuk setiap subview saya ingin meneruskan ID posisi ke kelas UIView. Controller dan subview dibuat dengan storyboard.

Jadi pendekatan terbaru dan terbaik saya adalah

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)
   }
}

Dan

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)
   }
}

Saya juga mencoba membuat kode UIView dengan ini

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")
    }
}

Tapi itu tampak lebih jauh dari kode yang sedang berjalan. Dengan definisi UIView atas saya menerima kesalahan Kesalahan fatal: init(coder:) belum diterapkan di konsol dan Properti 'self.subviewName' tidak diinisialisasi di super.init panggil sebaris dalam editor. Keduanya berhubungan dengan

super.init(coder: aDecoder)

Saya telah mencari posting lain di sini dengan pesan kesalahan ini, tetapi tidak ada yang saya lihat membantu saya. Setiap bantuan sangat dihargai :-)

0
w461 1 Juli 2020, 19:44

1 menjawab

Jawaban Terbaik

Cobalah untuk menjadikannya opsional

 var subviewName: String?

Dan jika Anda menjadikannya sebagai outlet maka Anda tidak harus menetapkan instance baru di sini

SpatialProblemView(subviewName: "red")

Hanya menetapkan properti

redSquare.subviewName = "red"
1
Sh_Khan 1 Juli 2020, 16:53