2017-05-29 2 views
0

J'ai donc créé un iCarousel et j'ai pu l'exécuter avec succès. J'ai cependant besoin de charger plus d'un carrousel sur le viewcontroller. J'ai trouvé le code multiple d'iCarousels et j'ai essayé de l'adapter à Swift. Maintenant, malheureusement, je reçois un signal Thread1 SIGABRT qui s'affiche sur la ligne "class AppDelegate". Je n'ai vraiment aucune idée de pourquoi ça fait ça.iCarousel - Signal Thread1 SIGABRT

S'il vous plaît aidez-moi! Voici le code que j'ai pour la 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 
    } 
} 

}

Répondre

1

je peux recréer votre erreur et elle est causée par shirtsArray être vide et donc la ligne

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

fait l'exception que vous rencontrez.

Je ne sais pas pourquoi, mais si vous déplacez la ligne

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

pour être juste sous la cession à hatsArray, il fonctionne.

Votre fonction viewForItemAt est un peu compliquée. Pourquoi créez-vous des images/vues pour les deux carrousels avant de décider lequel est requis?

+1

Merci beaucoup! Ça a marché! Étrange, bien qu'il réussisse à annuler l'exception ... Peut-être est-ce dû à un conflit avec "coursel1.reloadData()" –

+0

En ce qui concerne votre dernière question ... Je pensais que je devais le faire de cette façon car les deux carrousels chargeront toujours les images en même temps. Il n'y aura jamais d'exemple où un seul carrousel est chargé. Pourriez-vous élaborer ou donner un exemple sur comment vous pensez que j'aurais dû m'y attaquer? –

+0

La fonction sera appelée deux fois, une fois pour chaque carrousel avec le paramètre du carrousel réglé en conséquence. Si vous testez lequel au début de la fonction, il vous suffit de configurer l'imageView pour le carrousel particulier appelé. – Nick