0

collectionView이있는 tableViewCell, collectionView's cells은 맞춤형이며, 단지 imageView 만 있습니다. 내 CollectionView class에서 여기사용자 정의 CollectionViewCell의 ImageView는 구성해야 할 때 nil입니다.

Here is my test project

된다 DataSource 필요한 방법 : I 셀의 이미지 뷰에 대한 이미지를 설정하려고하면

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ImageCell", for: indexPath) as! ImageCell 

    let image = UIImage(named: listItems[indexPath.row]) 
    cell.testImageView.image = image 

    return cell 
} 

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return listItems.count 
} 

내가 얻을이 error : 나는 image을 확인했다

fatal error: unexpectedly found nil while unwrapping an Optional value

, 그것은 nil 아니지만, testImageView입니다, 나는 collectionViewCell의 testImageView에 이미지를 설정하려고하면 오류가 발생합니다. 어떻게 해결할 수 있습니까? 여기 enter image description here

EDIT1 이 방법은 내가이 하나 collectionView cellForItemAt indexPath에서 코드를 제거하면 collectionView의 또한 listItem

func load(listItem: [String]) { 
    self.listItems = listItem 
    reloadData() 

} 

모두가 아마 잘

let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ImageCell", for: indexPath) 
let imageView = UIImageView(image:UIImage(named: listItems[indexPath.row])) 

cell.backgroundView = imageView 
+0

testImageView, 인터페이스 빌더에서 IBOutlet으로 추가됩니까? –

+0

이미지보기의 콘센트를 연결 했습니까? –

+0

@Ahmad F 예 그렇습니다 @ Midhun MP 그렇습니다 – astrolka

답변

1

두 개의보기 컨트롤러를 잘못 사용했습니다. IB 콘센트가 다른보기 컨트롤러의 셀에 연결되어 있습니다. 동일한 IBOutlet에 연결된 여러 컨트롤러에서 여러 개의 뷰를 가질 수 있지만 먼저로드 한 뷰가 연결되어 있지 않은 경우 해당 뷰가 충돌합니다.

콘센트가 연결된 셀입니다. This is the cell your outlet was connected to.

이 는로드하려고하는 (그러나 이미지 뷰에 함께 IBOutlet을 연결하지 않은)이다 :

enter image description here

+0

오, 정말 복사 - 붙여 넣기 방법이 실패했습니다.) 낭비한 시간으로 인해 미안합니다 ( – astrolka

+0

@astrolka BTW, 그냥 머리를 위로, 당신은 Objective-C와 혼합 방식이 이상합니다. 거기에 같은 접근에 대한 특별한 이유가 있습니까? –

+0

같은 일을하려고하지만 obj-c 아무것도 데이터 원본 메서드에 [여기에 대한 자세한 내용은] 호출되지 않습니다 때 (http://stackoverflow.com/questions/40194032/ui collectionview-delegate-method-cellforitematindexpathindexpath-is-not-called) : D – astrolka

0

을하고있다 채우기 위해 tableViewController에서 호출 "testImageView"아웃렛 변수가 인터페이스 빌더에서 연결되어 있지 않거나 n이 있습니다. CollectionViewCell (reuseIdentifier "ImageCell"). LLDB po 명령을 사용하여 셀이 nil인지 여부를 확인하십시오.

+0

reuseIdentifier "ImageCell"이없는 경우 dequeCell 메서드에 오류가 발생했습니다 –

+0

재사용 식별자가 정상이며 셀이 0이 아니므로 여기에서 무엇이 잘못 되었습니까 ((( – astrolka

+0

@astrolka는 Storyboard 또는 nib/xib에서 설계된 셀입니까? 파일? –

1

그냥 경우에 대신 코드를 사용하려면 ..

import UIKit 


class ImageCell : UICollectionViewCell { 

    private var imageView: UIImageView! 
    private var descLabel: UILabel! 

    public var image: UIImage? { 
     get { 
      return self.imageView.image 
     } 

     set { 
      self.imageView.image = newValue 
     } 
    } 

    public var imageDesc: String? { 
     get { 
      return self.descLabel.text 
     } 

     set { 
      self.descLabel.text = newValue 
     } 
    } 

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

     self.initControls() 
     self.setTheme() 
     self.doLayout() 
    } 

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

     self.initControls() 
     self.setTheme() 
     self.doLayout() 
    } 

    override func awakeFromNib() { 
     super.awakeFromNib() 
    } 

    func initControls() { 
     self.imageView = UIImageView() 
     self.descLabel = UILabel() 
    } 

    func setTheme() { 
     self.imageView.contentMode = .scaleAspectFit 

     self.descLabel.numberOfLines = 1 
     self.descLabel.lineBreakMode = .byWordWrapping 
     self.descLabel.textAlignment = .center 
     self.descLabel.textColor = UIColor.black 

     self.contentView.backgroundColor = UIColor.white 
    } 

    func doLayout() { 
     self.contentView.addSubview(self.imageView) 
     self.contentView.addSubview(self.descLabel) 

     self.imageView.leftAnchor.constraint(equalTo: self.contentView.leftAnchor, constant: 5).isActive = true 
     self.imageView.rightAnchor.constraint(equalTo: self.contentView.rightAnchor, constant: -5).isActive = true 
     self.imageView.topAnchor.constraint(equalTo: self.contentView.topAnchor, constant: 0).isActive = true 

     self.descLabel.leftAnchor.constraint(equalTo: self.contentView.leftAnchor, constant: 5).isActive = true 
     self.descLabel.rightAnchor.constraint(equalTo: self.contentView.rightAnchor, constant: -5).isActive = true 
     self.descLabel.topAnchor.constraint(equalTo: self.imageView.bottomAnchor, constant: 5).isActive = true 
     self.descLabel.bottomAnchor.constraint(equalTo: self.contentView.bottomAnchor, constant: -5).isActive = true 

     for view in self.contentView.subviews { 
      view.translatesAutoresizingMaskIntoConstraints = false 
     } 
    } 
} 


class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { 

    private var collectionView: UICollectionView! 
    private var dataSource: Array<String>! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.initDataSource() 
     self.initControls() 
     self.setTheme() 
     self.registerClasses() 
     self.doLayout() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    func initDataSource() { 
     self.dataSource = ["Image1", "Image2", "Image3", "Image4", "Image5", "Image6"] 
    } 

    func initControls() { 
     let layout = UICollectionViewFlowLayout() 
     layout.itemSize = CGSize(width: 117, height: 125) 
     layout.invalidateLayout() 
     self.collectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout) 
     self.collectionView.delegate = self 
     self.collectionView.dataSource = self 
    } 

    func setTheme() { 
     self.collectionView.backgroundColor = UIColor.clear 

     self.edgesForExtendedLayout = UIRectEdge(rawValue: 0) 
     self.view.backgroundColor = UIColor.blue 
    } 

    func registerClasses() { 
     self.collectionView.register(ImageCell.self, forCellWithReuseIdentifier: "ImageCellIdentifier") 
    } 

    func doLayout() { 
     self.view.addSubview(self.collectionView) 

     self.collectionView.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true 
     self.collectionView.rightAnchor.constraint(equalTo: self.view.rightAnchor).isActive = true 
     self.collectionView.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true 
     self.collectionView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true 

     for view in self.view.subviews { 
      view.translatesAutoresizingMaskIntoConstraints = false 
     } 
    } 

    func numberOfSections(in collectionView: UICollectionView) -> Int { 
     return 1 
    } 

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     return self.dataSource.count 
    } 

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ImageCellIdentifier", for: indexPath) as! ImageCell 

     let imageName = self.dataSource[indexPath.row] 
     cell.image = UIImage(named: imageName) 
     cell.imageDesc = imageName 

     return cell 
    } 
} 

http://imgur.com/o7O7Plw

enter image description here