iOS
UIViewController
Поиск…
Наследование
Подклассификация UIControl
дает нам доступ к следующим методам:
-
beginTrackingWithTouch
вызывается, когда палец сначала прикасается к границам элемента управления. -
continueTrackingWithTouch
вызывается многократно, когда палец скользит по элементу управления и даже за пределами границ элемента управления. -
endTrackingWithTouch
вызывается, когда палец поднимается с экрана.
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
Таким образом, диспетчер представлений настроен как делегат и реагирует на события касания от нашего пользовательского элемента управления.
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"
}
}
Заметки
Альтернативные методы достижения одного и того же результата без подкласса включают добавление цели или использование распознавателя жестов.
Нет необходимости использовать делегат с этими методами, если они используются только самим настраиваемым элементом управления. Мы могли бы просто добавить оператор
print
чтобы показать, как вызываются события. В этом случае код будет упрощен доimport 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") } }
Создать экземпляр
стриж
let viewController = UIViewController()
Objective-C
UIViewController *viewController = [UIViewController new];
Установить программный вид
стриж
class FooViewController: UIViewController {
override func loadView() {
view = FooView()
}
}
Создавать с помощью раскадровки
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
С идентификатором :
Дайте сцену идентификатор раскадровки в инспекторе идентификации раскадровки.
Введите код:
UIViewController *controller = [storyboard instantiateViewControllerWithIdentifier:@"myIdentifier"];
Создайте исходный элемент управления представлением :
Внутри раскадровки выберите контроллер представления, затем выберите инспектор атрибутов, установите флажок «Исходный контроллер просмотра».
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *controller = [storyboard instantiateInitialViewController];
Доступ к контроллеру просмотра контейнера
Когда контроллер представления представлен в контроллере панели вкладок, вы можете получить доступ к контроллеру панели вкладок следующим образом:
стриж
let tabBarController = viewController.tabBarController
Objective-C
UITabBarController *tabBarController = self.tabBarController;
Когда контроллер просмотра является частью навигационного стека, вы можете получить доступ к контроллеру навигации следующим образом:
стриж
let navigationController = viewController.navigationController
Objective-C
UINavigationController *navigationController = self.navigationController;
Добавление / удаление контроллера детского представления
Чтобы добавить контроллер детского представления:
- (void)displayContentController:(UIViewController *)vc {
[self addChildViewController:vc];
vc.view.frame = self.view.frame;
[self.view addSubview:vc.view];
[vc didMoveToParentViewController:self];
}
Чтобы удалить контроллер детского представления:
- (void)hideContentController:(UIViewController *)vc {
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
}