2016-05-16 2 views
2

Lorsque vous essayez de dessiner comme dans une application iOS, nous avons rencontré un problème. Après des heures de recherche sans succès, nous avons décidé de demander ici.Dessin à Cocoa avec Swift Crée une erreur

Pour faire un dessin que nous avons créé une classe comme

import Cocoa 

class DrawImageHolder: NSView { 
    override func drawRect(dirtyRect: NSRect) { 
     super.drawRect(dirtyRect) 
     print(" drawRect is executed ") 

     // drawing code 
    } 
} 

alors nous avons connecté la classe à un NSView comme celui-ci

enter image description here

Mais nous avons reçu

- [NSApplication runModalForWindow:] ne peut pas être invoqué à l'intérieur d'une virgule de transaction t (cela signifie généralement qu'il a été invoqué à l'intérieur de la méthode -drawRect: de la vue ). La boîte de dialogue modale a été supprimée pour éviter les interblocages ( ).

message de la console au lieu de dessiner. En plus de l'impression ("drawRect est exécuté") n'a pas été exécuté. Il est très probable que nous oublions quelque chose de simple.

+0

connexes: https://stackoverflow.com/questions/30955889/selecting- global-or-object-print-function –

Répondre

1

Votre classe hérite de NSView:

class DrawImageHolder: NSView 

Ainsi, le print que vous utilisez:

print(" drawRect is executed ") 

est en fait NSView « s print. La vue essaie d'afficher une boîte de dialogue pour l'impression, et comme l'indique l'erreur, elle le fait à partir d'un endroit où elle ne devrait pas l'être.

La solution est de préfixe print avec Swift de sorte que vous êtes explicitement à l'aide de Swift print au lieu de print de NSView:

class DrawImageHolder: NSView { 
    override func drawRect(dirtyRect: NSRect) { 
     super.drawRect(dirtyRect) 
     Swift.print(" drawRect is executed ") 
    } 
} 
+0

'CGContextFillPath (context)' ne devrait pas être là pour dessiner du code dans les commentaires, donc quand il est effacé, le problème a été résolu. – Hope