Swift 4: значение типа '(SomeUIViewController) -> () -> (SomeUIViewController) "не имеет члена" someMemberItem " - PullRequest
0 голосов
/ 27 декабря 2018

Я программно пытаюсь открыть новый UIViewController из другого выбора UITableViewCell программно.

Я делаю это так:

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

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Выполнение lazy инициализации подпредставлений решило проблемы, которые у меня были.То есть:

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

и т. Д. И т. П.

0 голосов
/ 27 декабря 2018

Вы получаете это из-за

var someMemberItem : SomeMemberItemClass

В соответствии с Документами У вас SomeUIViewController нет инициализатора, определяющего значение по умолчанию someMemberItem

, если оноЕсли это будет struct, то ошибки не будет, потому что struct по умолчанию обеспечивает Memberwise Initializers в отличие от класса

, если ваш пользовательский тип имеет хранимое свойство, которое логически может иметь значение «без значения».- возможно, из-за того, что его значение не может быть установлено во время инициализации или из-за того, что в какой-то более поздний момент ему разрешено не иметь «значения» - объявите свойство с необязательным типом.Свойства необязательного типа автоматически инициализируются значением nil, что указывает на то, что свойство преднамеренно предназначено для того, чтобы при инициализации было «еще нет значения».

у вас есть следующие параметры

1) Укажите значение по умолчанию

2) Сделайте его необязательным

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...