サーチ…


サブクラス化

UIControlをサブクラスUIControlすると、次のメソッドにアクセスできます。

  • beginTrackingWithTouchは、指がコントロールの境界内で最初にタッチすると呼び出されます。
  • continueTrackingWithTouchは、指がコントロールを横切ってスライドしたり、コントロールの境界の外にスライドしたりしても、繰り返し呼び出されます。
  • endTrackingWithTouchは、指が画面から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()

目標-C

UIViewController *viewController = [UIViewController new];

プログラムでビューを設定する

迅速

class FooViewController: UIViewController {

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

}

ストーリーボードからインスタンス化する

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

識別子付き

ストーリーボードのアイデンティティインスペクタ内でストーリーボードIDをシーンに与えます。

ここに画像の説明を入力

コードでインスタンス化する:

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

最初のviewcontrollerをインスタンス化する

ストーリーボード内でView Controllerを選択し、属性インスペクタを選択して、「Is Initial View Controller」チェックボックスをオンにします。

ここに画像の説明を入力

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

コンテナビューコントローラにアクセスする

ビューコントローラがタブバーコントローラ内に表示されると、次のようにタブバーコントローラにアクセスできます。

迅速

let tabBarController = viewController.tabBarController

目標-C

UITabBarController *tabBarController = self.tabBarController;

ビューコントローラがナビゲーションスタックの一部である場合、次のようにナビゲーションコントローラにアクセスできます。

迅速

let navigationController = viewController.navigationController

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


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow