Buscar..


Subclases

Subclase UIControl nos da acceso a los siguientes métodos:

  • Se llama a beginTrackingWithTouch cuando el dedo toca por primera vez los límites del control.
  • continueTrackingWithTouch se llama repetidamente a medida que el dedo se desliza por el control e incluso fuera de los límites del control.
  • endTrackingWithTouch se llama cuando el dedo se levanta de la pantalla.

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

Así es como el controlador de vista está configurado para ser el delegado y responder a eventos táctiles de nuestro control personalizado.

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"
    }
}

Notas

  • Los métodos alternativos para lograr el mismo resultado sin subclasificar incluyen agregar un objetivo o usar un reconocedor de gestos.

  • No es necesario usar un delegado con estos métodos si solo se usan dentro del propio control personalizado. Podríamos haber añadido una declaración de print para mostrar cómo se llaman los eventos. En ese caso, el código se simplificaría para

      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")
          }
      }
    

Crear una instancia

Rápido

let viewController = UIViewController()

C objetivo

UIViewController *viewController = [UIViewController new];

Establecer la vista programáticamente

Rápido

class FooViewController: UIViewController {

  override func loadView() {
    view = FooView()
  }

}

Instancia de un guión gráfico

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

Con un identificador :

Déle a la escena una identificación de guión gráfico dentro del inspector de identidad del guión gráfico.

introduzca la descripción de la imagen aquí

Instancia en el código:

UIViewController *controller = [storyboard instantiateViewControllerWithIdentifier:@"myIdentifier"];

Instalar un controlador de vista inicial :

Dentro del guión gráfico, seleccione el controlador de vista, luego seleccione el inspector de atributos, marque la casilla "Es el controlador de vista inicial".

introduzca la descripción de la imagen aquí

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *controller = [storyboard instantiateInitialViewController];

Accede al controlador de vista de contenedor

Cuando el controlador de vista se presenta dentro de un controlador de barra de pestañas, puede acceder al controlador de barra de pestañas de esta manera:

Rápido

let tabBarController = viewController.tabBarController

C objetivo

UITabBarController *tabBarController = self.tabBarController;

Cuando el controlador de vista forma parte de una pila de navegación, puede acceder al controlador de navegación de esta forma:

Rápido

let navigationController = viewController.navigationController

C objetivo

UINavigationController *navigationController = self.navigationController;

Agregar / quitar un controlador de vista hijo

Para agregar un controlador de vista secundario:

- (void)displayContentController:(UIViewController *)vc {
   [self addChildViewController:vc];
   vc.view.frame = self.view.frame;
   [self.view addSubview:vc.view];
   [vc didMoveToParentViewController:self];
}

Para quitar un controlador de vista hijo:

- (void)hideContentController:(UIViewController *)vc {
   [vc willMoveToParentViewController:nil];
   [vc.view removeFromSuperview];
   [vc removeFromParentViewController];
}


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow