Suche…


Unterklasse

Mit Subclassing UIControl wir Zugriff auf die folgenden Methoden:

  • beginTrackingWithTouch wird aufgerufen, wenn der Finger zum ersten Mal innerhalb der Grenzen des Steuerelements aufliegt.
  • continueTrackingWithTouch wird wiederholt aufgerufen, wenn der Finger über das Steuerelement und sogar außerhalb der Grenzen des Steuerelements gleitet.
  • endTrackingWithTouch wird aufgerufen, wenn der Finger vom Bildschirm abhebt.

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

Auf diese Weise wird der View Controller als Delegat eingerichtet und reagiert auf Berührungsereignisse von unserem benutzerdefinierten Steuerelement.

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

Anmerkungen

  • Alternative Methoden zum Erzielen des gleichen Ergebnisses ohne Unterklassifizierung umfassen das Hinzufügen eines Ziels oder die Verwendung eines Gestenerkenners.

  • Es ist nicht erforderlich, einen Delegaten mit diesen Methoden zu verwenden, wenn sie nur im benutzerdefinierten Steuerelement selbst verwendet werden. Wir hätten einfach eine print Anweisung hinzufügen können, print zu zeigen, wie die Ereignisse aufgerufen werden. In diesem Fall würde der Code auf vereinfacht

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

Erstellen Sie eine Instanz

Schnell

let viewController = UIViewController()

Ziel c

UIViewController *viewController = [UIViewController new];

Stellen Sie die Ansicht programmgesteuert ein

Schnell

class FooViewController: UIViewController {

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

}

Instanziieren Sie aus einem Storyboard

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

Mit einer Kennung :

Vergeben Sie der Szene im Identitätsinspektor des Storyboards eine Storyboard-ID.

Geben Sie hier die Bildbeschreibung ein

Im Code instanziieren:

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

Instanziieren Sie einen ersten Viewcontroller :

Wählen Sie im Storyboard den View Controller aus, wählen Sie dann den Attribut-Inspector aus, und aktivieren Sie das Kontrollkästchen "Ist Initial View Controller".

Geben Sie hier die Bildbeschreibung ein

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

Rufen Sie den Container-View-Controller auf

Wenn der Ansichts-Controller innerhalb eines Registerkarten-Controllers angezeigt wird, können Sie wie folgt auf den Registerkarten-Controller zugreifen:

Schnell

let tabBarController = viewController.tabBarController

Ziel c

UITabBarController *tabBarController = self.tabBarController;

Wenn der View Controller Teil eines Navigationsstapels ist, können Sie wie folgt auf den Navigationscontroller zugreifen:

Schnell

let navigationController = viewController.navigationController

Ziel c

UINavigationController *navigationController = self.navigationController;

Hinzufügen / Entfernen eines untergeordneten Ansichtscontrollers

So fügen Sie einen untergeordneten Ansichtscontroller hinzu:

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

So entfernen Sie einen untergeordneten Ansichtscontroller:

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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow