2017-05-11 5 views
0

Ich bin neu in der iOS-Entwicklung. Ich versuche ein XIB in meiner App zu implementieren. Ich möchte diese XIB als Teil einer Ansicht hinzufügen, und ich möchte die Klicks/Taps, die in den Unteransichten dieser XIB (Schaltfläche, Bild usw.) auftreten, erfassen/abfangen.XIB - UIView oder UIControllerView

Zuerst habe ich die Datei-Besitzer-Klasse des XIB auf eine UIView-Unterklasse eingestellt, aber jetzt sehe ich keine Möglichkeit, die Klicks/Taps aus dieser Unterklasse in meinem ViewController zu behandeln.

Soll ich (und darf ich das) die File Owner-Klasse stattdessen auf meine ViewController-Klasse setzen? Ist das erlaubt? Wie sollen wir mit diesen in XIBs gemachten Taps/Clicks umgehen?

Antwort

0

Nein, Sie sollten den FileOwner nicht auf ViewController setzen. Sie sollten dem ViewController einen Gestenerkenner hinzufügen und diesen GestenRecognizer zur Ansicht hinzufügen.

Ich weiß nicht, in Swift, aber in Objective-C würde man so etwas tun:

UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarger:customView action:@selector(mySelector)];

0

Besitzer Datei ist ein Proxy oder Stand-in für ein tatsächliches Objekt, das identifiziert wird, wenn die Die Feder ist geladen. [ed. Ich sollte beachten, "Nib" ist die alte Bezeichnung für Interface-Dateien. Xib ist der neue Name. Tatsächlich kompilieren Xib-Dateien zu Nib-Dateien, wenn Ihr Projekt erstellt wird. Verzeih mir, wenn ich etwas altmodisch bin und nib/xib synonym benutze] Du könntest deinen View-Controller als "Dateibesitzer" in deiner Interface-Datei verwenden. Mit ihm könnte wie folgt aussehen:

class MyViewController : UIViewController { 
    @IBOutlet loadedView : UIView! 

    func loadMyInterface() { 
     // load the nib with myself as the "Files Owner". If the nib file is set up properly 
     // shoudl set the "loadedView" outlet on this object 
     Bundle.mainBundle.loadNibNamed("MyLoadedView", owner: self, options: nil) 

    } 
} 

In diesem Code-Schnipsel, ich habe die loadedView Steckdose. Wenn mein View-Controller erstellt wird, lautet er nil. Dann rufe ich irgendwann in der Ausführung meines Programms loadMyInterface. Diese Routine fordert das Hauptpaket auf, die Schnittstellendatei "MyLoadedView" zu laden. Beachten Sie, dass ich an diesem Punkt dem System sage, welches Objekt "Dateibesitzer" darstellt. Da ich meinen View-Controller als owner identifiziert habe, werden alle Ausgänge in der Interface-Datei, die für den Eigentümer der Datei identifiziert werden, mit diesem View-Controller verbunden.

Zusätzlich können Sie Aktionen für Ihre View-Controller-Klasse definieren und diese bis zum "File's Owner" im Interface Builder verbinden. Wenn die lib geladen ist, werden sie zum View-Controller geleitet.

Beachten Sie jedoch, dass dies einfach deshalb ist, weil ich meinen View Controller als owner identifiziert habe, als die Spitze geladen wurde. Ich hätte einfach irgendein anderes Objekt als Besitzer der Datei einrichten können und dafür sorgen können, dass die Verkaufsstellen und Aktionen für den Besitzer dorthin gehen.

0

Um es einfach zu machen, erstellen Sie eine benutzerdefinierte Klasse für den Xib, genauso wie Sie mit dem viewController mit Ausgängen für Schaltflächen und Labels, IBAction und mehr. Dann erstellen Sie ein Protokoll, das folgt, und setzen Sie den Delegaten auf dieses Protokoll von Ihrem Ziel MainView und ViewController, wo Sie den Xib anzeigen möchten. Wenn Sie auf die Schaltfläche in Xib klicken, wird auf das Protokoll verwiesen und eine Funktion in der ViewController aufgerufen.

Custom:

protocol customViewDelegate: class { 
func buttonClicked() 
} 

class CustomView: UIView { 
weak var delegate: customViewDelegate? 

@IBAction func buttonPressed(_ sender: Any) { 
    delegate?.buttonClicked() 
} 
} 

Und die Viewcontroller:

class viewController: UIViewController { 
@IBOutlet weak var viewContainer: CustomView! 

var customView: CustomView? 

override func viewDidLoad() { 
customView = CustomView.loadFromNib() 
customView.delegate = self 
} 
func buttonClicked() { 
    //Do what you wanted to do when the button inside the Xib was clicked. 
} 
} 
Verwandte Themen