我正在以编程方式尝试以编程方式从其他UITableViewCell选择中打开新的UIViewController。
我正在这样做:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let destination = SomeUIViewController()
destination.someMemberItem = someDataArray[indexPath.row]
navigationController?.pushViewController(destination, animated: true)
}
SomeUIViewController
是UIViewController
,其中有一个变量成员需要显示。
SomeUIViewController
的初始化方式如下:
class SomeUIViewController: UIViewController {
var someMemberItem : SomeMemberItemStruct
// MARK: Layout
let someMemberItemImage: UIImageView = {
let view = UIImageView(frame: CGRect(x: 20, y: 20, width: 300, height: 300))
if let imageUrl = self.someMemberItem.imageUrl {
let data = NSData(contentsOf: imageUrl)
view.image? = UIImage(data: data)
} else {
view.image = nil // Set default image
}
return view
}()
let someMemberItemLabel: UILabel = {
let label = UILabel(frame: CGRect(x: 100, y: 200, width: 100, height: 50))
label.text = self.someMemberItem.name
label.textColor = .black
label.font = UIFont.boldSystemFont(ofSize: 16)
return label
}()
func setUpNavigationBar() {
navigationItem.title = self.someMemberItem.name
navigationController?.navigationBar.barTintColor = UIColor(r: 30, g: 255, b: 198)
navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.darkGray, NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 20)]
}
func setUpSomeMemberItemView() {
self.view.addSubview(someMemberItemLabel)
self.view.addSubview(someMemberItemImage)
}
override func viewDidLoad() {
super.viewDidLoad()
setUpNavigationBar()
setUpSomeMemberItemView()
}
}
public extension UIColor {
public convenience init(r: CGFloat, g: CGFloat, b: CGFloat) {
self.init(red: r/255, green: g/255, blue: b/255, alpha: 1)
}
}
如上所述,整个应用程序都是以编程方式完成的。
我收到一条错误消息,提示“类'SomeUIViewController'没有初始化程序”
我在这些行上遇到相同的错误:
if let imageUrl = self.someMemberItem.imageUrl {
和
label.text = self.someMemberItem.name
错误显示“类型为'(SomeUIViewController)->()->(SomeUIViewController)'的值没有成员'someMemberItem'”的地方。
任何人以前都遇到过此错误,并且知道如何解决吗?
更新:
SomeMemberItemStruct
的定义如下:
public struct SomeMemberItemStruct: Decodable {
let id: Int
let name : String
let imageUrl : String?
let description : String
enum CodingKeys: String, CodingKey {
case id
case name
case imageUrl
case description
}
}
答案 0 :(得分:0)
因为
var someMemberItem : SomeMemberItemClass
根据Docs,您SomeUIViewController
没有用于定义默认值someMemberItem
的初始化程序
如果它是struct,那么不会有任何错误,因为struct默认提供 Memberwise Initializers (与类不同)
如果您的自定义类型的存储属性在逻辑上被允许为“无值”(可能是因为在初始化期间无法设置其值,或者是因为在以后的某个时候允许其无值),请声明具有可选类型的属性。可选类型的属性会自动使用nil值进行初始化,表明该属性在初始化过程中故意有“无值”的含义。
您有以下选择
1)提供默认值
2)使其为可选
答案 1 :(得分:0)
对子视图进行lazy
初始化解决了我遇到的问题。也就是说
lazy var someMemberItemLabel: UILabel = {
//
}()
以此类推。