Sök…


Subclassing

UIControl ger oss tillgång till följande metoder:

  • beginTrackingWithTouch kallas när fingret först rör sig ner inom kontrollens gränser.
  • continueTrackingWithTouch kallas upprepade gånger när fingret glider över kontrollen och även utanför kontrollens gränser.
  • endTrackingWithTouch kallas när fingret lyfter från skärmen.

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

Så här är visningskontrollern inställd för att vara delegat och svara på beröringshändelser från vår anpassade kontroll.

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

anteckningar

  • Alternativa metoder för att uppnå samma resultat utan underklassering inkluderar att lägga till ett mål eller använda en gestigenkännare.

  • Det är inte nödvändigt att använda en delegat med dessa metoder om de bara används inom den anpassade kontrollen. Vi kunde precis ha lagt till ett print uttalande för att visa hur händelserna kallas. I så fall skulle koden förenklas till

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

Skapa en instans

Snabb

let viewController = UIViewController()

Objective-C

UIViewController *viewController = [UIViewController new];

Ställ in vyn programmatiskt

Snabb

class FooViewController: UIViewController {

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

}

Instantiate från ett Storyboard

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

Med en identifierare :

Ge scenen ett Storyboard-ID inom identitetsinspektören på storyboard.

ange bildbeskrivning här

Instantiate in code:

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

Instantera en första visningskontroller :

Välj storykontrollen i storyboard och välj sedan attributinspektören, kryssa i rutan "Är första visningskontroller".

ange bildbeskrivning här

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

Öppna behållarens vykontroll

När visningskontrollern presenteras i en tabbfältkontroller kan du komma åt tabbfältkontrollern så här:

Snabb

let tabBarController = viewController.tabBarController

Objective-C

UITabBarController *tabBarController = self.tabBarController;

När visningskontrollern är en del av en navigationsstack kan du komma åt navigeringsstyrenheten så här:

Snabb

let navigationController = viewController.navigationController

Objective-C

UINavigationController *navigationController = self.navigationController;

Lägga till / ta bort en kontroll av barnvyn

Så här lägger du till en kontroller för barnvy:

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

Så här tar du bort en barndisplaykontroll:

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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow