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 in

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

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.

inserisci la descrizione dell'immagine qui

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

inserisci la descrizione dell'immagine qui

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];
}


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow