【问题标题】:Swift 4: Value of type '(SomeUIViewController) -> () -> (SomeUIViewController)' has no member 'someMemberItem'Swift 4:类型“(SomeUIViewController)->()->(SomeUIViewController)”的值没有成员“someMemberItem”
【发布时间】:2018-12-27 04:29:28
【问题描述】:

我正在以编程方式尝试以编程方式从不同的 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
    }
}

【问题讨论】:

  • 请提供您的“SomeMemberItemClass”类信息
  • @Khushbu SomeMemberItem 是一个结构,而不是一个类,这是我的错误。

标签: swift uitableview uiviewcontroller


【解决方案1】:

你得到这个是因为

var someMemberItem : SomeMemberItemClass

根据Docs 你SomeUIViewController 没有定义默认值someMemberItem 的初始化程序

如果是 struct 则不会有任何错误,因为 struct 默认提供 Memberwise Initializers 不像类

如果您的自定义类型有一个逻辑上允许“无值”的存储属性——可能是因为它的值不能在初始化期间设置,或者因为它允许在稍后的某个时间点有“无值”——声明具有可选类型的属性。可选类型的属性会自动使用 nil 值进行初始化,这表明该属性在初始化期间故意设置为“还没有值”。

你有以下选择

1) 提供默认值

2) 使其可选

【讨论】:

  • SomeMemberItem 是一个结构,我打错了。我收到一个结构错误。
  • @Q.H.但是你不能声明没有初始值或可选或惰性类型的属性。课内
【解决方案2】:

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

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

等等等等。

【讨论】:

  • 你的意思不是“诸如此类”吗? ;-)
猜你喜欢
  • 2018-03-21
  • 2019-02-14
  • 2018-11-07
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多