2016-05-31 10 views
0

UIPrintInteractionControllerDelegate 기록 된 데 UIPrintInteractionControllerDelegate을 테스트하는 UIPrintPaper을 만드는 방법, 나는 printInteractionController:choosePaper:

그 선언의 용지 선택 기능을 테스트 장치에 원하는 것은 :

optional func printInteractionController(_ printInteractionController: UIPrintInteractionController, choosePaper paperList: [UIPrintPaper]) -> UIPrintPaper 

가 IT를 호출하는 간단한 문제입니다 미리 정의 된 UIPrintPaper 값 및 출력 확인 그러나 UIPrintPaper 인스턴스를 만들 수 없습니다. 여기 UIPrintPaper 선언하는 방법입니다

NS_CLASS_AVAILABLE_IOS(4_2)__TVOS_PROHIBITED @interface UIPrintPaper : NSObject 

+ (UIPrintPaper *)bestPaperForPageSize:(CGSize)contentSize withPapersFromArray:(NSArray<UIPrintPaper *> *)paperList; // for use by delegate. pass in list 

@property(readonly) CGSize paperSize; 
@property(readonly) CGRect printableRect; 

@end 

PAPERSIZE 및 printableRect 속성은 읽기 전용이며,이를 정의 할 초기화가 없습니다. 테스트를 위해 다른 용지 크기를 나타내는 UIPrintPaper를 어떻게 만들 수 있습니까? (A4는 미국 편지, 4 × 6 ...)

답변

1

는 UIPrintPaper를 제어하지만 읽기 전용 속성을 재정의를 서브 클래스 화하는 것은 straighforward입니다 수 없습니다 :

class FakePrintPaper: UIPrintPaper { 

    private let size: CGSize 
    override var paperSize: CGSize { return size } 
    override var printableRect: CGRect { return CGRect(origin: CGPointZero, size: size) } 

    init(size: CGSize) { 
     self.size = size 
    } 
} 
0

사용 UIPrintPaper 클래스 메소드 bestPaperForPageSize :

let paper = UIPrintPaper.bestPaperForPageSize(CGSize(...), withPapersFromArray: [...]) 

난 당신이 이런 식으로 사용하려는 것이 상상이 :

class MyClass: NSObject { } 

extension MyClass: UIPrintInteractionControllerDelegate { 
    func printInteractionController(printInteractionController: UIPrintInteractionController, choosePaper paperList: [UIPrintPaper]) -> UIPrintPaper { 
     return UIPrintPaper.bestPaperForPageSize(CGSize(...), withPapersFromArray: paperList) 
    } 
} 

CGSize는 어디 귀하의 용지 크기.

+0

이 문제를 해결하려면이 방법을 호출하기 위해 UIPrintPaper를 어떻게 만듭니 까? (그것의 withPapersFromArray : UIPrintPaper의 배열이다.) – Clafou

+0

@Clafou 내가 생각하기에 접근법에 대한 나의 대답을 편집했다. – JAL

+0

그게 내가 가지고있는 구현이지만, bestPaperForPageSize가 항상 필요한 것을하지 않는다는 것이 밝혀졌습니다. 따라서 이러한 단위 테스트를 작성해야 할 필요가 있습니다 (그리고 아마도 내 자신의 논리를 대신 구현할 수도 있습니다 - 단위 테스트를 작성할 수있게되면 볼 수 있습니다). 내 질문은 UIPrintPaper를 작성하여 단위 테스트를 할 수 있도록하는 것입니다. – Clafou

0

난 당신이 UIPrintPaper를 작성 해야하는 생각하지 않습니다. 애플의 API 호출 :

- (UIPrintPaper*)printInteractionController:(UIPrintInteractionController *)printInteractionController choosePaper:(NSArray<UIPrintPaper *> *)paperList 

을 ... 프린터가 지원하는 모든 UIPaper의 배열과의 UIPrintInteractionControllerDelegate에. 원하는 프린터를 찾지 못하면 프린터가 프린터를 지원하지 않습니다.

대신 하나를 만드는 대신이 대리자 호출을 구현하고 프린터가 지원하는 매개 변수에서 올바른 UIPrintPaper를 반환하십시오.

+0

사실,하지만 내 질문에 설명했듯이 단위 테스트 목적으로이 기능이 필요했습니다. 이 경우에는 테스트에 필요한 UIPaper 인스턴스를 제공하기 위해 프린터를 사용할 수 없습니다. – Clafou

+0

왜 안 되니? 나는 이것을 위해 프린터 시뮬레이터를 사용한다.로드 할 용지를 지정합니다. xcode를 지원합니다. – xaphod

+0

단위 테스트는 반복 가능하고, 완전히 자동화되고 자체 포함되어야합니다. – Clafou