2015-06-10 23 views
6

Ich lerne über NSControl. Ich bin mir bewusst, dass NSCell in OS X 10.10 Yosemite seinen Weg zur Abwertung begonnen hat, und deshalb würde ich lieber keine API verwenden, die weggeht. Die Klassenreferenz NSControl zeigt außerdem, dass alle Zellenaccessoren veraltet sind.Kann ich in OS X 10.10 ein NSControl ohne NSCell implementieren?

Ich verstehe das alles, aber was nicht so klar ist, ist, was der empfohlene Kurs für Leute ist, die NSControl Unterklassen am 10.10 schreiben. Alle Apple-Handbücher zu diesem Thema erwähnen die Entwertung von NSCell nicht. Ich nehme an, ich könnte einfach Dinge auf die alte Art tun, aber dann müsste ich meinen Code ändern, wenn Apple die Entwertung von NSCell auf die nächste Stufe vorrückt.

Ist es überhaupt möglich, eine NSControl Unterklasse ohne NSCell überhaupt zu implementieren?

Kann jemand Rat geben oder mich mit einer Ressource auf diesem Thema verbinden? Dies ist schwierig zu googeln.

Antwort

3

Ich versuche, dies auch auszuarbeiten. Ich kann leider nicht alle Ihre Fragen beantworten, aber hier ist, was ich bisher gefunden habe.

Die AppKit Release Notes for OS X v10.10 haben eine kurze Erklärung, was passiert, was ich ursprünglich in der Frage How to create a custom themed NSButton without subclassing NSButtonCell? sah.

Allmähliche deprecation von NSCell

Mac OS X 10.10 nimmt einen weiteren Schritt in Richtung auf die eventuelle deprecation von Zellen. Direkter Zugriff auf die Zelle eines Steuerelements wird abgeraten, und Methoden, die es ermöglichen, wird es in einer folgenden -Version formell veraltet. Eine Vielzahl von APIs auf Zellebene wurden zu verschiedenen Control-Unterklassen befördert, um zellenfreien Zugriff auf wichtige Funktionen zu ermöglichen. NSLevelIndicator, NSTextField, NSSearchField, NSSlider, und NSPathControl haben alle neue Eigenschaften für diesen Zweck. Zellenbasierte NSTableViews sind jetzt veraltet und View-basierte NSTableViews sollten stattdessen verwendet werden. Matrix-basierte NSBrowser werden auch zugunsten der Item-basierten Schnittstelle zugunsten veraltet.

In der 10.10-Dokumentation sind viele NSControl-Methoden rot durchgestrichen. (Übrigens bin ich mir nicht sicher, ob dies eindeutig "veraltet" bedeutet.)

Die Dokumentationsmarkierungen für continuous und enabled sind jedoch irreführend. Ich habe bei den Erklärungen für NSControl durch die Header-Datei gesucht, die in der Dokumentation sind durchgestrichen und es scheint ein paar andere Dinge auf den Weg zu geben:

  1. Diese Methode mit NS_DEPRECATED_MAC veraltet ist:

    // Use formatters instead. See -[NSControl formatter] and -[NSControl setFormatter:]. 
    - (void)setFloatingPointFormat:(BOOL)autoRange left:(NSUInteger)leftDigits right:(NSUInteger)rightDigits NS_DEPRECATED_MAC(10_0, 10_0); 
    
  2. erscheinen Diese Methoden in einer NSDeprecated Kategorie:

    @interface NSControl (NSDeprecated) 
    
    // Use formatters instead. See -[NSControl formatter] and -[NSControl setFormatter:]. 
    - (void)setFloatingPointFormat:(BOOL)autoRange left:(NSUInteger)leftDigits right:(NSUInteger)rightDigits NS_DEPRECATED_MAC(10_0, 10_0); 
    
    + (void)setCellClass:(Class)factoryId; 
    + (Class)cellClass; 
    
    - (id)cell; 
    - (void)setCell:(NSCell *)aCell; 
    - (id)selectedCell; 
    - (NSInteger)selectedTag; 
    
    - (void)setNeedsDisplay; // Use setNeedsDisplay:YES instead. 
    - (void)calcSize; 
    
    - (void)updateCell:(NSCell *)aCell; 
    - (void)updateCellInside:(NSCell *)aCell; 
    - (void)drawCellInside:(NSCell *)aCell; 
    - (void)drawCell:(NSCell *)aCell; 
    - (void)selectCell:(NSCell *)aCell; 
    
    @end 
    
  3. Diese Methoden App in der Dokumentation als "Verfügbar in OS X v10.8 bis OS X v10.9" , aber nicht in der Header-Datei NSControl, so gehe ich davon aus sie vollständig entfernt haben.

    -userInterfaceLayoutDirection 
    -setUserInterfaceLayoutDirection 
    
  4. Diese Erklärungen zuvor Methoden waren, sondern in dem Eigentum Refactoring worden Siehe this answer für Details über das, was passierte . die isEnabled/setEnabled Methoden So werden diese Erklärungen in der Dokumentation durchgestrichen, aber das ist irreführend:

    @property (getter=isContinuous) BOOL continuous; 
    @property (getter=isEnabled) BOOL enabled; 
    

ich habe jede gute Informationen über nicht gefunden, wie eine NSControl Unterklasse erstellen, ohne auch creati ng eine NSCell Unterklasse, obwohl anscheinend NSColorWell eine zellfreie NSControl ist.

Meine aktuelle grobe Schlussfolgerung ist, dass NSControl ziemlich stark an NSCell gekoppelt ist, und es ist nicht sinnvoll, eins ohne das andere zu verwenden. Also überlege ich, stattdessen eine NSView Unterklasse zu schreiben.

Ich würde auch mehr Informationen und Rat hier schätzen!