2016-02-23 3 views
7

मैं एल कैपिटन में पेश किए गए नए NSCollectionView एपीआई के साथ प्रयोग कर रहा हूं।एनएससीओलेक्शन देखें डेटा स्रोत ठीक से काम नहीं कर रहा है

डब्ल्यूडब्ल्यूडीसी वीडियो के बाद, मैं संग्रह दृश्य के लेआउट को निर्धारित करने के लिए NSCollectionViewFlowLayout का सबक्लास बना देता हूं।

class Layout : NSCollectionViewFlowLayout { 

    override func prepareLayout() { 

    super.prepareLayout() 

    self.minimumInteritemSpacing = 0 
    self.minimumLineSpacing = 0 

    let cheight = self.collectionView!.bounds.height 
    let cwidth = self.collectionView!.bounds.width 

    self.itemSize = CGSizeMake(cwidth/2.0, cheight/6.0) 

    } 

} 

उसके बाद, मैं डेटा स्रोत के रूप में काम करने के लिए एक NSObject उपवर्ग बना लिया है।

class DataSource : NSObject, NSCollectionViewDataSource { 

    func collectionView(collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int { 
    return 5 
    } 

    func collectionView(collectionView: NSCollectionView, itemForRepresentedObjectAtIndexPath indexPath: NSIndexPath) -> NSCollectionViewItem { 

    /* DOESN'T GET CALLED! */ 

    let item = collectionView.makeItemWithIdentifier("cell", forIndexPath: indexPath) 

    item.view.wantsLayer = true 
    item.view.layer?.backgroundColor = NSColor.redColor().CGColor 

    return item 

    } 

} 

मुद्दा कि collectionView:itemForRepresentedObjectAtIndexPath: कहा जाता हो जाता है कभी नहीं है।

यह कैसे मैं संग्रह दृश्य आरंभ है:

let collectionView = NSCollectionView(frame: view.bounds) 

let dataSource = DataSource() 
let layout = Layout() 

collectionView.collectionViewLayout = layout 
collectionView.registerClass(NSCollectionViewItem.self,  
          forItemWithIdentifier: "cell") 
collectionView.dataSource = dataSource 

collectionView.backgroundColors = [.blackColor()] 

मैं स्पष्ट रूप से देख सकते हैं अपने superview में संग्रह देखने के लिए, लेकिन कोई कोशिकाएं होती हैं।

इसके अलावा, अगर यह प्रतिनिधि, प्रतिनिधि के बाहर बुलाया जाता है (लेकिन सेल क्लास पंजीकृत होने के बाद) ऐप क्रैश करता है!

let item = collectionView.makeItemWithIdentifier("cell", forIndexPath: /*any index path*/) 

क्या मैं कुछ गलत कर रहा हूं या NSCollectionView नया एपीआई टूट गया है?

धन्यवाद।

+0

यह शायद एक बेवकूफ सवाल है लेकिन आप अपने दृश्य के सबव्यू में संग्रह दृश्य जोड़ रहे हैं, है ना? – Aaron

+0

@Aaron मैं हूँ। मैं अपने पर्यवेक्षण (कोशिकाओं के बिना) संग्रह संग्रह देख सकता हूं –

+1

आप कैसे जानते हैं कि विधि को नहीं कहा गया था? क्या आपने उस विधि के अंदर कुछ ब्रेकपॉइंट सेट किया था? या विधि के शरीर के अंदर कुछ लॉग करने की कोशिश की? क्या आपकी 'cell.xib' फ़ाइल एक ही बंडल में है? या आप इंटरफ़ेस प्रोग्रामेटिक रूप से बनाते हैं (जैसा कि आपने _class_ पंजीकृत किया है लेकिन _nib_ नहीं)? क्या आपने संग्रह दृश्य का प्रवाह फ़ॉर्म _ "विरासत" _ को बदल दिया है आईबी में _ "प्रवाह" _? – holex

उत्तर

0

विधि makeItemWithIdentifier महत्वपूर्ण है और आप बंडल .xib नामित "सेल" के लिए लग रहा है: आप registerNib से पंजीकृत आवश्यकता हो सकती है: forItemWithIdentifier: अगर यह एक और बंडल से आता है।

इस प्रकार अपने समस्या यह है कि पहले आता है अपने collectionView के बाद से: itemForRepresentedObjectAtIndexPath कभी नहीं कहा जाता हो जाता है और यह आपकी पैटर्न से उत्पन्न हो सकते हैं: तुम क्यों डेटा स्रोत के रूप में काम करने के लिए एक नया वर्ग तैयार की जाती है और न ही NSViewController का उपयोग जहां NSCollectionView बसता था ?

मैं हमेशा ऐसा करता हूं और नए एपीआई के साथ सभी पूरी तरह से काम करता है। उम्मीद है कि यह आपकी मदद कर सकता है!

+0

मैं प्रोग्राम दृश्य रूप से संग्रह दृश्य बनाने की कोशिश कर रहा हूं, यही कारण है कि मैं ' मैं 'रजिस्टर क्लास: forItemWithIdentifier:' के बजाय 'registerNib: forItemWIthIdentifier' का उपयोग कर रहा हूं। –

+0

मैंने भाग्य के बिना रजिस्टर क्लास और रजिस्टर दोनों को भी कोशिश की है। संख्याOfItemsInSection को बुलाया जाता है लेकिन itemForRepresentedObjectAtIndexPath नहीं करता है। – empedocle

0

मुझे लगभग एक ही समस्या थी, और यहां मैंने इसे हल किया है।

सभी समस्या मैं था सबसे पहले:

  • जब मेरे संग्रह दृश्य प्रतिनिधि NSCollectionViewDelegateFlowLayout प्रोटोकॉल को लागू नहीं किया गया था, सब कुछ ठीक हो गया था और collectionView: जब मेरे संग्रह दृश्य प्रतिनिधि था itemForRepresentedObjectAtIndexPath विधि
  • बुलाया गया था NSCollectionViewDelegateFlowLayout प्रोटोकॉल को लागू करने, collectionView: itemForRepresentedObjectAtIndexPath विधि

आमंत्रित नहीं किया गया मैं हर NSColl बाहर टिप्पणी की प्रतिनिधि में ectionViewDelegateFlowLayout विधि, और यह पता चला कि यदि विधि संग्रह दृश्य: लेआउट: संदर्भ आकारफोरहेडर इनसेक्शन: टिप्पणी की गई थी, तो सब कुछ ठीक था (हालांकि मैं हेडर का उपयोग नहीं करता)।

यह पता चला कि संग्रह दृश्य: लेआउट: संदर्भ आकारफोरहेडर इनसेक्शन: 0 के बजाय NaN लौटा रहा था।आकार में चौड़ाई के रूप में 0 (बेवकूफ प्रतिलिपि/पेस्ट गलती)।

क्या आप वाकई अपने लेआउट की वापसी में एक ही तरह की समस्या नहीं है?

0

मेरा मुद्दा यह था कि मैंने संग्रह दृश्य के आइटमों के लिए निब या कक्षा पंजीकृत नहीं की थी। लक्षण आपके जैसा वर्णन करते थे - numberOfItemsInSection कहा जाता था, और itemForRepresentedObjectAtIndexPath नहीं था। एक निब पंजीकृत करने के बाद, विधि शुरू की जा रही शुरू हुई। यहां प्रासंगिक उत्तर दिया गया है - https://stackoverflow.com/a/39516035/4635852

संबंधित मुद्दे