Я новичок в разработке iOS, поэтому простите меня, если мне не хватает чего-то очевидного. У меня есть контроллер представления, который содержит подвью, в котором я создал numpad, и пока я хочу дать numpad просмотр своего собственного подкласса UIView, потому что я хочу сделать с ним несколько разных вещей. Прямо сейчас numpad просто создает строку из нажатых клавиш, и я настроил делегат, чтобы передать эту строку в другом месте, где я хочу ее использовать (хотя я также попытался получить доступ к исходному вводу непосредственно в представлении контроллер с let a = subview(); label.text = a.rawInput).Swift 2.2 - Обновление UILabel бросает «неожиданно найдено нуль при распаковке необязательного значения»
Всякий раз, когда я пытаюсь установить текст UILabel в контроллере представления на необработанный вход subview, независимо от того, делегируется ли или нет, UILabel обнаружен как nil и выбрасывает ошибку в заголовке.
Вещи, которые я пробовал:
- Установка текста внутри переопределения viewDidLoad, так и вне его
- Установка переменной (testInput) внутри контроллера представления принять необработанный ввод в подвид и установив (я подтвердил, что переменная внутри контроллера представления правильно настроена, поэтому никаких проблем с делегацией)
- Использование didSet в переменной testInput как для установки текста меток на testInput, так и для вызова вызова viewDidLoad и установки метки текст там (печать testInput внутри этого didSet выводит правильную строку, F WIW)
- Удаление и перекомпоновки в IBOutlet для моего лейбла
- Сильные и слабые хранения для IBOutlet переменной
- Попытка сделать то же самое в другой подвид внутри контроллера представления, в случае, если по какой-то причине это было мнение собственная ошибка контроллера
- Поиск везде решение, которое работает
я тупик. Вот мой соответствующий код Numpad:
import UIKit
protocol NumpadDelegate {
func updateInput(input: String)
}
class Numpad: UIView {
// MARK: UI outlets
@IBOutlet weak var decButton: UIButton!
// MARK: Properties
var rawInput: String = ""
var visibleInput: String = ""
var calcInput: String = ""
var operandReady = 1
var percentWatcher = 0
var delegate: NumpadDelegate? = BudgetViewController()
// MARK: Functions
func handleRawInput(str: String) {
rawInput += str
print("numpad input is \(rawInput)")
delegate?.updateInput(rawInput)
}
А вот код вида контроллера:
import UIKit
class BudgetViewController: UIViewController, NumpadDelegate {
// MARK: Properties
//@IBOutlet weak var transactionValueField: UITextField!
@IBOutlet weak var remainingCashForIntervalLabel: UILabel!
@IBOutlet weak var intervalDenoterLabel: UILabel!
@IBOutlet weak var currencyDenoterLabel: UILabel!
@IBOutlet weak var mainDisplayView: TransactionType!
@IBOutlet weak var inactiveInputView: InactiveInput!
@IBOutlet weak var numpadView: Numpad!
@IBOutlet weak var rawInputLabel: UILabel!
var remainingCashForInterval = 40
let display = TransactionType()
var testInput = "" {
didSet {
viewDidLoad()
}
}
override func viewDidLoad() {
super.viewDidLoad()
// let numpad = Numpad()
// numpad.delegate = self
// print("\(numpad.delegate)")
self.rawInputLabel.text = testInput
}
func updateInput(input: String) {
print("view controller now has \(input)")
display.mainInput = input
testInput = input
}
Как примечание стороны, в случае, если вы заметили, что мой протокол не является типом класса, для некоторых причина добавляет: класс к нему и объявление моего делегата в качестве слабой переменной не позволяет делегации работать. Есть предложения?
typo on 'weak var delegate; NumpadDelegate? '. ':' вместо ';' –
Спасибо. Обновленный ответ. – Rob
Благодарим вас за ответ. Если я раскомментирую эту строку, но не numpad = Numpad(), то numpad является нерешенным идентификатором. Если я изменю его на Numpad.delegate = self, он говорит, что «делегат-член экземпляра» не может использоваться для типа «Numpad» ». Если я изменю его на Numpad(). Delegate = self, ошибки нет, но делегация перестает работать. Какие-либо предложения? – Justin