Пытаясь дать UIButton особую собственность - PullRequest
1 голос
/ 31 января 2020

Мне нужен UIButton, чтобы иметь свойство bookId. Я попробовал следующий код, но он выдает ошибку Property 'self.bookId' not initialized at super.init call. Мне нужно свойство, чтобы иметь возможность запрашивать базу данных для этого c bookId при нажатии кнопки.

import UIKit

class BookUIButton: UIButton {
var bookId: String

init(frame: CGRect, bookId: String) {
    super.init(frame: frame);
    self.bookId = bookId
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

override init(frame: CGRect) {
    super.init(frame: frame)
}

override func awakeFromNib() {
    super.awakeFromNib()

    //TODO: Code for our button
}
}

Любая помощь будет принята с благодарностью !!!

Ответы [ 3 ]

1 голос
/ 31 января 2020

swift заставляет вас инициализировать каждый элемент var, прежде чем он когда-либо будет использоваться. Поскольку он не может быть уверен, что произойдет, когда наступит супер-поворот, он выдаст ошибку: лучше, чем потом сожалеть!

Решение 1:

class BookUIButton: UIButton {
var bookId: String?

init(frame: CGRect, bookId: String) {
    super.init(frame: frame);
    self.bookId = bookId
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

override init(frame: CGRect) {
    super.init(frame: frame)
}

override func awakeFromNib() {
    super.awakeFromNib()

    //TODO: Code for our button
}
}

Решение 2: Есть лучший способ чтобы пропустить эту ошибку. Поэтому все, что вам нужно сделать, это инициализировать элемент после объявления:

class BookUIButton: UIButton {
var bookId: String = String()

init(frame: CGRect, bookId: String) {
    super.init(frame: frame);
    self.bookId = bookId
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

override init(frame: CGRect) {
    super.init(frame: frame)
}

override func awakeFromNib() {
    super.awakeFromNib()

    //TODO: Code for our button
}
}
0 голосов
/ 01 февраля 2020

Поскольку вы всегда можете создать экземпляр кнопки из раскадровки, эта кнопка должна иметь требуемый init? (Кодировщик aDecoder: NSCoder) . Этот метод необходим только для того, чтобы вы вставили кнопку в раскадровку. Если кнопка действительно создается через раскадровку, то, конечно, у нее не будет достаточно идентификатора (во время инициализации), чтобы она не была необязательной.

Поскольку я предполагаю, что вы всегда будете создавать экземпляр кнопки программно и не через раскадровку, вы можете просто реализовать свой собственный init с вашими параметрами, а затем, в требуемом init, просто вставить fatalError.

Это скомпилируется, когда fatalError возвращает Never (то есть никогда не возвращается). ), поэтому компилятор может понять, что bookId на самом деле никогда не будет равен нулю.

На самом деле, если вы удалите требуемый init, Xcode предложит вам вставить метод с fatalError и автоматически завершит его для вас, если вы захотите.

Конечно, после этого, если вы поместите кнопку этого класса в раскадровку, она обработает sh, так что не делайте этого.

Добавление свойства к кнопке (или просмотр в целом) и принудительно создавать его с помощью некоторого init, а не через раскадровку, в целом, это прекрасно, если вы не собираетесь использовать раскадровку для этой кнопки (или представления).

PS: после этого краткого рассказа о том, как делать то, что вы хотите, я хочу предложить вам НЕ делать этого в этом случае, так как кажется плохой идеей для кнопки хранить какие-либо данные о каком-то API, который вам нужно вызвать , Кнопка должна быть просто кнопкой и информировать вас, когда пользователь нажимает на нее. Затем, когда кнопка нажата, другой класс должен решить, что делать, используя другую модель, чтобы получить соответствующий bookId для нажатия этой кнопки.

Совершенно другое было бы, если бы вы добавили какое-то свойство, которое помогло кнопке чтобы выглядеть иначе или добавить какое-то другое поведение, определяющее c использование кнопки (которая может быть нажата и информировать о нажатиях)

0 голосов
/ 31 января 2020

Важно ли иметь его с именем bookId? И важно ли быть строкой? Что если вы только что дали UIButton тег? (например, ButtonName.tag = Int)

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