iCarousel — сигнал Thread1 SIGABRT

Итак, я создал iCarousel и смог успешно его запустить. Однако мне нужно было загрузить более одной карусели на контроллере просмотра. Я нашел несколько кодов iCarousels и попытался адаптировать их к Swift. Теперь, к сожалению, я получаю сигнал SIGABRT Thread1, который отображается в строке «класс AppDelegate». На самом деле понятия не имею, почему он это делает.

Пожалуйста, помогите мне! Вот код, который у меня есть для ViewController

class ChangeRoomViewController: UIViewController, iCarouselDataSource, 
iCarouselDelegate {

    var hatsArray : NSMutableArray = NSMutableArray()
    var shirtsArray : NSMutableArray = NSMutableArray()

@IBOutlet weak var carousel1: iCarousel!
@IBOutlet weak var carousel2: iCarousel!

override func viewDidLoad() {

    super.viewDidLoad()

    hatsArray = ["TopHat.jpeg", "WhiteBrimHat.jpeg", "StoutHat.jpg", "BaseballCapBlackw:Red.jpg", "WhiteBaseballCap.jpg"]
    carousel1.type = iCarouselType.cylinder
    carousel1.reloadData()

    shirtsArray = ["StarWarsBlackFittedT.jpg", "CollaredFittedWhiteWithBeigeSplash.jpg", "CollaredWhiteWithZigzagLightBlueStripes.jpg", "ClooaredBlackWithWhiteStripes.jpg", "CollaredFittedNavyBlue.jpg"]
    carousel2.type = iCarouselType.cylinder
    carousel2.reloadData()
}

func carousel(_ carousel: iCarousel, viewForItemAt index: Int, reusing view: UIView?) -> UIView {

    var hatsView : UIImageView!
    var shirtsView : UIImageView!

    if view == nil {
        hatsView = UIImageView(frame: CGRect(x: 16, y: 65, width: 90, height: 60))
        hatsView.contentMode = .scaleAspectFit
        shirtsView = UIImageView(frame: CGRect(x: 16, y: 133, width: 90, height: 60))
        shirtsView.contentMode = .scaleAspectFit
    } else {
        hatsView = view as! UIImageView
        shirtsView = view as! UIImageView
    }

    hatsView.image = UIImage(named: "\(hatsArray.object(at: index))")
    shirtsView.image = UIImage(named: "\(shirtsArray.object(at: index))")

    if (carousel == carousel1) {
        return hatsView
    }else {
        return shirtsView
    }

}

func numberOfItems(in carousel: iCarousel) -> Int {
    if (carousel == carousel1) {
        return hatsArray.count
    }else {
        return shirtsArray.count
    }
}

}


person Misho Milicevic    schedule 29.05.2017    source источник


Ответы (1)


Я могу воссоздать вашу ошибку, и она вызвана тем, что shirtsArray пуст, поэтому строка

shirtsView.image = UIImage(named: "\(shirtsArray.object(at: index))")

вызывает исключение, с которым вы столкнулись.

Я не уверен, почему, но если вы переместите линию

    shirtsArray = ["StarWarsBlackFittedT.jpg", "CollaredFittedWhiteWithBeigeSplash.jpg", "CollaredWhiteWithZigzagLightBlueStripes.jpg", "ClooaredBlackWithWhiteStripes.jpg", "CollaredFittedNavyBlue.jpg"]

быть просто под назначением в hatsArray, тогда работает.

Ваша функция viewForItemAt немного запутана. Почему вы создаете изображения/представления для обеих каруселей, прежде чем решить, какой из них требуется?

person Nick    schedule 29.05.2017
comment
Большое спасибо! Это сработало! Странно, хотя ему удается обнулить исключение... Возможно, это связано с конфликтом с coursel1.reloadData() - person Misho Milicevic; 30.05.2017
comment
Что касается вашего последнего вопроса... Я подумал, что мне нужно сделать это таким образом, потому что обе карусели всегда будут загружать изображения одновременно. Никогда не будет случая, когда загружается только одна карусель. Не могли бы вы уточнить или привести пример того, как, по вашему мнению, я должен был решить эту проблему? - person Misho Milicevic; 30.05.2017
comment
Функция будет вызываться дважды, по одному разу для каждой карусели с соответствующим набором параметров карусели. Если вы проверяете, какой из них в начале функции, вам нужно только настроить imageView для конкретной вызываемой карусели. - person Nick; 30.05.2017