2016-05-16 9 views
0

Ich habe eine Nib in meinem Storyboard, das mit nichts verbunden ist, aber ich bin es als Subview Instanziieren thusly:iOS UIButton in programatically instanziiert subview Brennen nicht

-(void)LoadCameraOverlayView 
{ 

    CameraOverlayViewController *cameraVC = [self.storyboard instantiateViewControllerWithIdentifier:@"CameraOverlayNib"]; 
    cameraVC.view.userInteractionEnabled = YES; 
    [self.view addSubview:cameraVC.view]; 
} 

Die UIViewController eine Kamera mit Feedback hat die funktioniert gut und eine Taste, die (wenn ich zum View-Controller segne auch funktioniert.)

Die Schaltfläche ist mit einem Touchdown-Ereignis und Touch Up Inside-Ereignis verknüpft.

Wenn ich auf die Schaltfläche klicke, kann ich sehen, dass sie sich visuell von ihrem Standardzustand in den fokussierten oder hervorgehobenen Zustand ändert, jedoch scheint keiner des Codes ausgeführt zu werden. Wenn ich einen NSLog in die ViewDidLoad stelle, kann ich das in der Konsole sehen, aber nicht für die verknüpfte Methode. Wenn ich jedoch zur Ansicht übergehe, funktioniert es.

Irgendwelche Ideen, was ist los?

Ich habe mir andere Lösungen angeschaut, aber ich denke nicht, dass es einen Blick in die Richtung geben könnte oder dass der CGRect nicht richtig kalibriert ist oder irgendetwas, da ich die visuelle Veränderung beim Anklicken der Schaltfläche sehen kann.

Danke.

+0

Wo fügen Sie die Auswahl für die Schaltfläche TouchDown und TouchUp in CameraOverlayViewController hinzu? Wurde in Interface Builder oder programmgesteuert getan? – Dare

Antwort

4

Dieser Code verletzt Regel Einer wie View-Controller verwenden:

CameraOverlayViewController *cameraVC = [self.storyboard instantiateViewControllerWithIdentifier:@"CameraOverlayNib"]; 
[self.view addSubview:cameraVC.view]; 

Sie können nicht einfach einen View-Controller instanziiert und dann seine Ansicht manuell zu der Ansicht Hierarchie wie das hinzufügen. Dafür gibt es sehr strenge Regeln; Es gibt einen ausgeklügelten "Tanz", den Sie tun müssen, um die Ansicht eines View-Controllers manuell zu Ihrer Oberfläche hinzuzufügen, und Sie tun nicht den Tanz.

Das Ergebnis ist, dass Ihre cameraVC entsteht, ist kein Platz in der View-Controller-Hierarchie, und verschwindet in einer Rauchwolke. Es gibt also kein Objekt, mit dem man sprechen kann, und wenn die Taste angetippt wird, passiert nichts.

Mein Vorschlag wäre: Verwenden Sie eine . XIB Datei, keine Storyboard-Szene, für diese Ansicht; und nachdem Sie es geladen und in die Schnittstelle eingefügt haben, verwenden Sie den Code, um die Schaltfläche so zu konfigurieren, dass sie mit self, Ihrem aktuellen View Controller kommuniziert.

+0

Vielen Dank für Ihre Antwort, ich werde mich darum kümmern. Kennen Sie irgendwelche Ressourcen, die mich in die richtige Richtung weisen könnten, wie Sie in diesem Zusammenhang bessere Kodierungspraktiken lernen können? Könntest du mir vielleicht auch erklären, wie man eine xib in die Schnittstelle lädt? Am Ende meinst du, ich verwende den Storyboard-View-Controller als Delegierten? – AlecGamble

+0

"Würdest du mir vielleicht auch erklären können, wie man eine Xib in die Schnittstelle lädt?" Bestimmt; Mein Online-Buch erklärt es Ihnen: http://www.apeth.com/iOSBook/ch07.html#_nib_loading_and_file_8217_s_owner – matt

+0

Und hier ist ein aktuelles herunterladbares Beispiel, wo ich genau das mache, was ich vorschlage (in meinem 'viewDidLoad'): Ich lade eine Ansicht von einer Feder, lege sie in die Schnittstelle und konfiguriere ihre Schaltfläche in Code: https://github.com/matnteub/Programming-iOS-Book-Examples/blob/master/iOS7bookExamples/bk2ch10p524keyboardAccessory/ch21p808keyboardAccessory /ViewController.m – matt

Verwandte Themen