수색…


하위 클래스

UIControl 을 하위 클래스 화하면 다음 메소드에 액세스 할 수 있습니다.

  • beginTrackingWithTouch 는 컨트롤의 경계 내에서 손가락이 처음으로 터치 될 때 호출됩니다.
  • continueTrackingWithTouch 는 손가락이 컨트롤을 가로 질러 슬라이딩하고 컨트롤의 경계를 벗어나는 경우에도 반복적으로 호출됩니다.
  • 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 관리자에서 스토리 보드 ID를 제공하십시오.

여기에 이미지 설명을 입력하십시오.

코드로 인스턴스화 :

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

초기 viewcontroller 인스턴스화 :

스토리 보드에서보기 컨트롤러를 선택한 다음 속성 관리자를 선택하고 "초기보기 컨트롤러인가"확인란을 선택하십시오.

여기에 이미지 설명을 입력하십시오.

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