UIImageView выход ноль в пользовательском UIView с XIB - PullRequest
0 голосов
/ 10 января 2019

Я создал пользовательский UIView с несколькими IBOutlets, включая UIImageView, и тремя UILabel с. Несмотря на установку значения изображения в функции awakeFromNib (), я все равно получаю нулевое значение для розетки при попытке установить его. UIView был создан с использованием пользовательского файла xib.

Я установил операцию set в awakeFromNib(), чтобы убедиться, что розетки были инициализированы до их установки, но это не помогло. Я не уверен, что это проблема с файлом xib, поскольку я когда-либо использовал только пользовательские xibs при создании пользовательской ячейки таблицы, так что, возможно, проблема кроется здесь?

class VotingCard: UIView {
    @IBOutlet weak var proPicImg: UIImageView!
    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var hometownLabel: UILabel!
    @IBOutlet weak var ratingLabel: UILabel!

    var proPic = UIImage()
    var name = ""
    var hometown = ""
    var rating = 0.0

    init(pic: UIImage, rush: Rush) {
        proPic = pic
        name = rush.fullName
        hometown = rush.homeTown
        rating = rush.compositeRating
        super.init(frame: CGRect(x: 0, y: 0, width: 250, height: 300))
    }

    override func awakeFromNib() {
        proPicImg.image = proPic
        nameLabel.text = name
        hometownLabel.text = hometown
        ratingLabel.text = "\(rating)"
    }

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

Мне нужно просмотреть простую карточку с видимым изображением профиля и соответствующими данными, но вместо этого она вылетает.

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Ваша проблема либо

1 - imageView не подключен к Ib, и исправление заключается в его подключении

Или

2 - Вы создаете объект вида с init(pic: UIImage, rush: Rush) {, и он наверняка не загрузит пользовательский интерфейс с представлением, следовательно, все выходы равны нулю, и исправление для добавления этого метода

class func getInstance(_ pic: UIImage, rush: Rush) -> VotingCard { 
   let v = Bundle.main.loadNibNamed("VotingCard", owner: self, options: nil)!.first as! VotingCard 
   v.proPic = pic
   v.name = rush.fullName
   v.hometown = rush.homeTown
   v.rating = rush.compositeRating
   return v
}

Вызов

let v = VotingCard.getInstance(<#image#>,rush:<#rush#>)
v.frame = // set some frame
// ready for use
0 голосов
/ 10 января 2019

РЕДАКТИРОВАТЬ

Разработка на основе NIB устарела:

Для разработчиков iOS использование раскадровок - рекомендуемый способ разработки пользовательские интерфейсы.

https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/NibFile.html

Но, похоже, вы пропустили этот шаг:

Во время выполнения вы загружаете nib-файл, используя метод loadNibNamed:owner: или его вариант. Владелец файла является заполнителем в перо файл для объекта, который вы передаете в качестве параметра владельца этого метод. Какие бы соединения вы ни установили с Файлами Владелец в nib-файле в Интерфейсном Разработчике восстанавливается, когда вы загрузить файл во время выполнения.

См. В качестве примера:

https://medium.com/@umairhassanbaig/ios-swift-creating-a-custom-view-with-xib-ace878cd41c5

Если вы хотите сделать это рекомендуемым способом с раскадровкой (очевидно, нет, но это для широкой аудитории):

https://developer.apple.com/library/archive/referencelibrary/GettingStarted/DevelopiOSAppsSwift/WorkWithViewControllers.html

viewDidLoad () - Вызывается, когда представление содержимого контроллера представления (верх его представления иерархии) создается и загружается из раскадровки. выходы контроллера вида гарантированно имеют действительные значения раз этот метод называется. Используйте этот метод для выполнения каких-либо дополнительных настройка требуется вашим контроллером вида.

Таким образом, с помощью метода UIViewController вместо кода введите viewDidLoad().

Имейте в виду, что всегда вызывается, так что это перезапишет работу вашей пользовательской функции init(). Возможно, это то, с чем вы столкнулись.

Я бы реорганизовал его, чтобы избежать уродливого кода. Всегда создавайте объект Rush (объявляйте его необязательным как сохраненное свойство), но инициализируйте его в awakeFromNib () для случая XIB и копируйте входной объект в случае custom-init.

Тогда viewDidLoad() не имеет условий.

...