Swift 4:类型'(SomeUIViewController)->()->(SomeUIViewController)'的值没有成员'someMemberItem'

时间:2018-12-27 04:29:28

标签: swift uitableview uiviewcontroller

我正在以编程方式尝试以编程方式从其他UITableViewCell选择中打开新的UIViewController。

我正在这样做:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let destination = SomeUIViewController()
    destination.someMemberItem = someDataArray[indexPath.row]
    navigationController?.pushViewController(destination, animated: true)
}

SomeUIViewControllerUIViewController,其中有一个变量成员需要显示。

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

2 个答案:

答案 0 :(得分:0)

因为

var someMemberItem : SomeMemberItemClass

根据Docs,您SomeUIViewController没有用于定义默认值someMemberItem的初始化程序

如果它是struct,那么不会有任何错误,因为struct默认提供 Memberwise Initializers (与类不同)

  

如果您的自定义类型的存储属性在逻辑上被允许为“无值”(可能是因为在初始化期间无法设置其值,或者是因为在以后的某个时候允许其无值),请声明具有可选类型的属性。可选类型的属性会自动使用nil值进行初始化,表明该属性在初始化过程中故意有“无值”的含义。

您有以下选择

1)提供默认值

2)使其为可选

答案 1 :(得分:0)

对子视图进行lazy初始化解决了我遇到的问题。也就是说

lazy var someMemberItemLabel: UILabel = {
    // 
}()

以此类推。