xcode - स्क्रैच से प्रोग्रामेटिक रूप से NSCollectionView कैसे बनाएँ?




cocoa (2)

@ बेवारियस आपने वहां एक उत्कृष्ट काम किया था। यह सिर्फ एक अद्भुत ट्यूटोरियल था जिसे मैं कभी-कभी ऐप्पल डॉक्स में याद करता हूं।

मैं दिलचस्पी रखने वाले किसी भी व्यक्ति के लिए स्विफ्ट (v2) में Bavarious कोड को फिर से लिखता हूं:

// AppDelegate.swift:

import Cocoa

let buttonSize:NSSize = NSSize(width: 80, height: 20)
let itemSize:NSSize = NSSize(width: 100, height: 40)
let buttonOrigin:NSPoint = NSPoint(x: 10, y: 10)

let titles:[String] = ["Case", "Molly", "Armitage", "Hideo", "The Finn", "Maelcum", "Wintermute", "Neuromancer"]

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    @IBOutlet weak var window: NSWindow!

    func applicationDidFinishLaunching(aNotification: NSNotification) {
        let cv = NSCollectionView(frame: self.window.contentView!.frame)
        cv.itemPrototype = BVTemplate()
        cv.content = titles

        cv.autoresizingMask = NSAutoresizingMaskOptions.ViewMinXMargin
            .union(NSAutoresizingMaskOptions.ViewWidthSizable)
            .union(NSAutoresizingMaskOptions.ViewMaxXMargin)
            .union(NSAutoresizingMaskOptions.ViewMinYMargin)
            .union(NSAutoresizingMaskOptions.ViewMaxYMargin)
            .union(NSAutoresizingMaskOptions.ViewHeightSizable)

        window.contentView!.addSubview(cv)
    }

    func applicationWillTerminate(aNotification: NSNotification) {
        // Insert code here to tear down your application
    }
}

// BVTemplate.swift:

import Cocoa

class BVTemplate: NSCollectionViewItem {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do view setup here.
    }

    override func loadView() {
        print("loadingView")
        self.view = BVView(frame: NSZeroRect)
    }

    override var representedObject:AnyObject? {
        didSet {
            if let representedString = representedObject as? String {
                (self.view as! BVView).button?.title = representedString
            }
        }
    }
}

// BVView.swift:

import Cocoa

class BVView: NSView {

    var button:NSButton?

    override init(frame frameRect: NSRect) {
        super.init(frame: NSRect(origin: frameRect.origin, size: itemSize))
        let newButton:NSButton = NSButton(frame: NSRect(origin: buttonOrigin, size: buttonSize))
        self.addSubview(newButton)
        self.button = newButton
    }

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

NSCollectionView कोको एपीआई के सबसे रहस्यमय हिस्सों में से एक है जो मैंने कभी देखा है। दस्तावेज़ीकरण खराब है और कई चलती हिस्से हैं, जिनमें से कई इंटरफ़ेस बिल्डर में अक्सर लागू होते हैं, जिससे दस्तावेज़ीकरण चुनौतीपूर्ण होता है।

कृपया NSCollectionView का सबसे सरल मामला बनाने के लिए नमूना कोड प्रदान करें जो NSCollectionView का उपयोग किये बिना टेक्स्ट फ़ील्ड या बटन प्रदर्शित करता है जहां प्रत्येक टेक्स्ट फ़ील्ड या बटन का एक अलग शीर्षक होता है। डिफ़ॉल्ट window IBOutlet के साथ एक नया एक्सकोड प्रोजेक्ट मानें।

इस उदाहरण के लिए, डेटा स्रोत परिवर्तन के रूप में NSCollectionView को अद्यतन करने के लिए कोई बाध्यकारी आवश्यक नहीं है। बस प्रोटोटाइप ऑब्जेक्ट्स का ग्रिड प्रदर्शित करें और प्रत्येक ऑब्जेक्ट का शीर्षक कुछ मान पर सेट करें।

अगर हम कई लोगों के लिए यह उपलब्ध कराने का एक अच्छा उदाहरण प्राप्त कर सकते हैं, तो मुझे लगता है कि यह उन सभी लोगों की मदद करेगा जो NSCollectionViews साथ काम करते हैं और जैसा कि मैं हूं।

अनुरोध का सारांश

  • एक नई एक्सकोड परियोजना में एनएससीओलेक्शन व्यू प्रस्तुत करने के लिए नमूना कोड प्रदान करें
  • इंटरफ़ेस बिल्डर का उपयोग न करें, प्रदान की गई डिफ़ॉल्ट विंडो IBOutlet का उपयोग करें
  • NSCollectionView में टेक्स्ट फ़ील्ड या बटन, आपकी पसंद होनी चाहिए
  • दृश्य में प्रत्येक आइटम का एक अलग शीर्षक होना चाहिए
  • कोई बाध्यकारी की आवश्यकता नहीं है

यदि वहां कोई नमूना कोड है जो इन आवश्यकताओं को पूरा करता है, तो कृपया एक लिंक प्रदान करें, जो बहुत अच्छा होगा!


एक mutable सरणी से बांधने के तरीके पर ब्रिगेडिर के सवाल का जवाब देने के लिए।

शून्य'थ - शीर्षक एनएसएमयूटेबलएरे बनाएं

सबसे पहले - अपने सामान में सरणी बांधें

[cv bind:NSContentBinding 
    toObject:self 
    withKeyPath:@"titles" 
    options:NULL];

दूसरा - शीर्षकों को बदलने पर, प्रॉक्सी को संशोधित करना सुनिश्चित करें।

जैसे

NSMutableArray *kvcTitles = [self mutableArrayValueForKey:@"titles"];
[kvcTitles removeLastObject];




nscollectionview