iOS
UIViewController
Ricerca…
subclassing
Sottoclasse UIControl
ci dà accesso ai seguenti metodi:
-
beginTrackingWithTouch
viene chiamato quando il dito tocca prima i limiti del controllo. -
continueTrackingWithTouch
viene chiamato ripetutamente mentre il dito scorre sul controllo e anche al di fuori dei limiti del controllo. -
endTrackingWithTouch
viene chiamato quando il dito si solleva dallo schermo.
MyCustomControl.swift
import UIKit
// These are out self-defined rules for how we will communicate with other classes
protocol ViewControllerCommunicationDelegate: class {
func myTrackingBegan()
func myTrackingContinuing(location: CGPoint)
func myTrackingEnded()
}
class MyCustomControl: UIControl {
// whichever class wants to be notified of the touch events must set the delegate to itself
weak var delegate: ViewControllerCommunicationDelegate?
override func beginTrackingWithTouch(touch: UITouch, withEvent event: UIEvent?) -> Bool {
// notify the delegate (i.e. the view controller)
delegate?.myTrackingBegan()
// returning true means that future events (like continueTrackingWithTouch and endTrackingWithTouch) will continue to be fired
return true
}
override func continueTrackingWithTouch(touch: UITouch, withEvent event: UIEvent?) -> Bool {
// get the touch location in our custom control's own coordinate system
let point = touch.locationInView(self)
// Update the delegate (i.e. the view controller) with the new coordinate point
delegate?.myTrackingContinuing(point)
// returning true means that future events will continue to be fired
return true
}
override func endTrackingWithTouch(touch: UITouch?, withEvent event: UIEvent?) {
// notify the delegate (i.e. the view controller)
delegate?.myTrackingEnded()
}
}
ViewController.swift
Questo è il modo in cui il controller di visualizzazione è impostato per essere il delegato e rispondere agli eventi di tocco dal nostro controllo personalizzato.
import UIKit
class ViewController: UIViewController, ViewControllerCommunicationDelegate {
@IBOutlet weak var myCustomControl: MyCustomControl!
@IBOutlet weak var trackingBeganLabel: UILabel!
@IBOutlet weak var trackingEndedLabel: UILabel!
@IBOutlet weak var xLabel: UILabel!
@IBOutlet weak var yLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
myCustomControl.delegate = self
}
func myTrackingBegan() {
trackingBeganLabel.text = "Tracking began"
}
func myTrackingContinuing(location: CGPoint) {
xLabel.text = "x: \(location.x)"
yLabel.text = "y: \(location.y)"
}
func myTrackingEnded() {
trackingEndedLabel.text = "Tracking ended"
}
}
Gli appunti
I metodi alternativi per ottenere lo stesso risultato senza sottoclassi includono l'aggiunta di un obiettivo o l'utilizzo di un riconoscitore di gesti.
Non è necessario utilizzare un delegato con questi metodi se vengono utilizzati solo all'interno del controllo personalizzato stesso. Potremmo aver appena aggiunto una dichiarazione di
print
per mostrare come vengono chiamati gli eventi. In tal caso, il codice verrà semplificato inimport UIKit class MyCustomControl: UIControl { override func beginTrackingWithTouch(touch: UITouch, withEvent event: UIEvent?) -> Bool { print("Began tracking") return true } override func continueTrackingWithTouch(touch: UITouch, withEvent event: UIEvent?) -> Bool { let point = touch.locationInView(self) print("x: \(point.x), y: \(point.y)") return true } override func endTrackingWithTouch(touch: UITouch?, withEvent event: UIEvent?) { print("Ended tracking") } }
Crea un'istanza
veloce
let viewController = UIViewController()
Objective-C
UIViewController *viewController = [UIViewController new];
Imposta la vista a livello di codice
veloce
class FooViewController: UIViewController {
override func loadView() {
view = FooView()
}
}
Istanziare da uno storyboard
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
Con un identificatore :
Assegna alla scena un ID storyboard all'interno del controllo identità dello storyboard.
Istanziare nel codice:
UIViewController *controller = [storyboard instantiateViewControllerWithIdentifier:@"myIdentifier"];
Istanziare un viewcontroller iniziale :
All'interno dello storyboard selezionare il controller della vista, quindi selezionare l'ispettore degli attributi, selezionare la casella "È il controller della vista iniziale".
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *controller = [storyboard instantiateInitialViewController];
Accedi al controller di visualizzazione del contenitore
Quando il controller della vista viene presentato all'interno di un controller della barra delle linguette, è possibile accedere al controller della barra delle schede in questo modo:
veloce
let tabBarController = viewController.tabBarController
Objective-C
UITabBarController *tabBarController = self.tabBarController;
Quando il controller della vista fa parte di una pila di navigazione, puoi accedere al controller di navigazione in questo modo:
veloce
let navigationController = viewController.navigationController
Objective-C
UINavigationController *navigationController = self.navigationController;
Aggiunta / rimozione di un controller di visualizzazione figlio
Per aggiungere un controller di visualizzazione figlio:
- (void)displayContentController:(UIViewController *)vc {
[self addChildViewController:vc];
vc.view.frame = self.view.frame;
[self.view addSubview:vc.view];
[vc didMoveToParentViewController:self];
}
Per rimuovere un controller di visualizzazione figlio:
- (void)hideContentController:(UIViewController *)vc {
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
}