iOS
UIViewController
Zoeken…
subklassen
Subklasse UIControl
geeft ons toegang tot de volgende methoden:
-
beginTrackingWithTouch
wordt genoemd wanneer de vinger voor het eerst binnen de grenzen van het besturingselement raakt. -
continueTrackingWithTouch
wordt herhaaldelijk aangeroepen als de vinger over het besturingselement schuift en zelfs buiten de grenzen van het besturingselement. -
endTrackingWithTouch
wordt opgeroepen wanneer de vinger van het scherm komt.
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
Dit is hoe de weergavecontroller is ingesteld om de gemachtigde te zijn en te reageren op aanraakgebeurtenissen vanuit ons aangepaste besturingselement.
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"
}
}
Notes
Alternatieve methoden om hetzelfde resultaat te bereiken zonder subklasse, zijn het toevoegen van een doel of het gebruik van een gebaarherkenning.
Het is niet nodig om een gemachtigde met deze methoden te gebruiken als deze alleen binnen het aangepaste besturingselement zelf worden gebruikt. We hadden net een
print
statement kunnen toevoegen om te laten zien hoe de evenementen worden genoemd. In dat geval zou de code worden vereenvoudigdimport 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") } }
Maak een instantie
Snel
let viewController = UIViewController()
Doelstelling C
UIViewController *viewController = [UIViewController new];
Stel de weergave programmatisch in
Snel
class FooViewController: UIViewController {
override func loadView() {
view = FooView()
}
}
Instantiëren vanaf een Storyboard
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
Met een ID :
Geef de scène een Storyboard-ID in de identiteitscontrole van het storyboard.
Instantiëren in code:
UIViewController *controller = [storyboard instantiateViewControllerWithIdentifier:@"myIdentifier"];
Direct een eerste viewcontroller starten :
Selecteer in het storyboard de weergavecontroller en selecteer vervolgens de kenmerkcontrole, schakel het selectievakje "Is initiële weergavecontroller" in.
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *controller = [storyboard instantiateInitialViewController];
Open de containerweergavecontroller
Wanneer de weergavecontroller wordt gepresenteerd in een tabbalkcontroller, kunt u de tabbalkcontroller als volgt openen:
Snel
let tabBarController = viewController.tabBarController
Doelstelling C
UITabBarController *tabBarController = self.tabBarController;
Wanneer de weergavecontroller deel uitmaakt van een navigatiestapel, kunt u de navigatiecontroller als volgt openen:
Snel
let navigationController = viewController.navigationController
Doelstelling C
UINavigationController *navigationController = self.navigationController;
Een kinderweergavecontroller toevoegen / verwijderen
Een kinderweergavecontroller toevoegen:
- (void)displayContentController:(UIViewController *)vc {
[self addChildViewController:vc];
vc.view.frame = self.view.frame;
[self.view addSubview:vc.view];
[vc didMoveToParentViewController:self];
}
Een child view-controller verwijderen:
- (void)hideContentController:(UIViewController *)vc {
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
}