비디오: iPad 또는 iPhone에서 HP Smart를 사용하여 무선 HP 프린터를 설정하는 방법 | HP 프린터 | HP 2024
iOS 응용 프로그램의보기 컨트롤러를 동일한 기본 클래스의 새로운보기 컨트롤러로 교체 할 수 있으므로 새보기 컨트롤러에 표시해야하는 버튼에 대한 액세스가 없거나 해지해야하는 팝업 오버입니다. 다행히도 Apple의 사람들은이를 수행하기에 완벽한 장소를 제공합니다.
테이블 엔트리를 탭할 때 segue가 트리거 될 때 - 새로운 컨트롤러가 뷰를 제자리에 슬라이드시키기 전에 스토리 보드 런타임은 현재 뷰 컨트롤러의 메서드를 호출하여 뷰 컨트롤러에 데이터를 전달할 수있게합니다. 에 대해 표시됩니다.
즉, 버튼 정보를 새보기 컨트롤러에 전달한 다음 시작하기도합니다. 그런 다음 prepareForSegue: sender:는 viewDidLoad에서 사용할 버튼을 할당하고 View Controller도 닫습니다. prepareForSegue: sender: segue가 수행 될 것으로 View Controller에게 통지하는 View Controller 메소드이다. segue는 UIStoryboadSegue 객체이며 segue와 관련된 뷰 컨트롤러에 대한 정보를 포함합니다.
코드를 prepareForSegue: sender: 메소드에 추가하여 DestinationController를 UISplitViewController 대리자로 만들고 popOverButton 및 masterPopoverController 속성을 할당합니다.
또한 팝업이 사라지면 사용자가보기를 터치 할 필요가 없도록 팝업을 닫습니다.
모든 작업을 수행하려면이 코드를 MasterViewController에 추가하십시오. 엠.
- (void) prepareForSegue: (UIStoryboardSegue *) 보낸 사람: (id) 보낸 사람 {if ([UIDevice currentDevice] userInterfaceIdiom == UIUserInterfaceIdiomPad) {DetailViewController * currentDetailViewController; (([UITO])). (UINavigationController *) [self. splitViewController. viewControllers lastObject]). topViewController; 그렇지 않으면 currentDetailViewController = [self.splitViewController. viewControllers lastObject]; if (currentDetailViewController. masterPopover Controller! = nil) [currentDetailViewController. masterPopover 컨트롤러 dismissPopoverAnimated: 예]; DetailViewController * destinationDetailViewController; if ([targetViewController isKindOfClass: [UINavigationController class]]) destinationDetailViewController = (DetailViewController *) ((UINavigationController *) segue. topViewController; else destinationDetailViewController = segue. destinationViewController; 본인. splitViewController. 델리게이트 = destinationDetailViewConroller; destinationDetailViewController. popOverButton = currentDetailViewController. popOverButton; destinationDetailViewController. masterPopoverController = currentDetailViewController입니다. masterPopoverController;}}
새로운 Detail Controller가 필요로하는 버튼과 popover 속성을 가지고 있기 때문에 현재 Detail View 컨트롤러를 찾는 것으로 시작합니다.
이 코드는보다 복잡해 보입니다. 먼저 iPad에서 실행 중인지 확인합니다. 만약 그렇다면 splitViewController의 viewController 배열에있는 뷰 컨트롤러 목록에 액세스하여 현재의 Detail View 컨트롤러를 얻습니다. 다행스럽게도 UIViewController 클래스에는 splitViewController 속성이있어 쉽게 사용할 수 있습니다.
그러면 네비게이션 컨트롤러가 viewControllers 배열에 있는지 확인하고, 있으면 거기에 네비게이션 컨트롤러의 topViewController (현재 뷰 컨트롤러)를 가져옵니다. 그렇지 않다면 배열의 컨트롤러를 사용하기 만하면됩니다. (여기에서 계속 진행되는 캐스팅이 많이 보일 것입니다.)
if ([[. splitViewController. viewController & # x2028; lastObject]
isKindOfClass: [UINavigationController & # x2028; class] currentDetailViewController = (RTDetailViewController *)(UINavigationController *)
[자체. splitViewController. viewController
lastObject]). topViewController; else
currentDetailViewController = & # x2028; [본인. splitViewController. viewControllers
lastObject];
다음으로, 팝 오버가 보일 경우, 그것을 해제하고 싶습니다. popover 컨트롤러가 있는지 확인합니다 (헤더 파일로 이동하여 속성을 액세스 가능하게해야하는 이유입니다.)
if (currentDetailViewController. masterPopoverController
! = nil)
[currentDetailViewController. masterPopoverController > dismissPopoverAnimated: YES];다음으로 현재 Detail View 컨트롤러를 찾는 데 사용 된 로직과 비슷한 로직을 사용하여 새 대상 컨트롤러 (전환 대상 컨트롤러)를 찾습니다.
if ([segue. destinationViewController < isKindOfClass: [UINavigationController
클래스]]) destinationDetailViewController =
(DetailViewController *) (UINavigationController *)
segue. destinationViewController;그러면 Split View Controller 대리자를 새 View Controller로 설정하여 splitViewController를 가져옵니다. willHideViewController: withBarButtonItem: forPopoverController: an splitViewController: willShowViewController: invalidatingBarButtonItem: 메시지입니다.
자아. splitViewController. delegate = destinationDetailViewController;
마지막으로 새 뷰 컨트롤러에서 popOverButton 및 masterPopOverController 속성을 할당합니다.
destinationDetailViewController. popOverButton =
currentDetailViewController. popOverButton;
destinationDetailViewController. masterPopoverController =
currentDetailViewController. masterPopoverController; 물론, popover를 취소하고 속성을 지정하지만 버튼을 표시하는 데 아무 것도하지 않습니다. 실제로는 viewDidLoad에서 완료됩니다.
또한 prefferedContentSize 속성에 값을 할당하여 팝업 창 크기를 지정할 수 있습니다. 실제 크기가 축소되어 Popover가 화면에 맞고 키보드가 제시 될 때 Popover가 키보드와 겹치지 않는다는 점을 알아야합니다. MasterViewController의 awakeFromNib 메소드에서이를 수행하는 코드를 볼 수 있습니다.
- (void) awakeFromNib {if ([[UIDevice currentDevice]
userInterfaceIdiom] == UIUserInterfaceIdiomPad)& # x2028; {본인. clearsSelectionOnViewWillAppear = NO;
자아. awakeFromNib 메시지는 모든 객체가로드되고 초기화 된 후에 스토리 보드에서 인스턴스화 된 객체로 보내집니다 (960> 0, 600.0). 메시지가 보내지면 모든 콘센트 및 작업 연결이 설정됩니다.
여기서 조언을 무시하고 팝 오버 컨트롤러를 닫지 않으면 팝 오버 창 외부의 탭으로 인해 팝 오버가 해제됩니다. 그러나 사용자가 지정된보기와 상호 작용하고 passthroughViews 속성을 사용하여 popover를 닫지 않도록 할 수는 있습니다 (여기서 수행하지는 않겠지 만). 그러고 나면 스스로 팝 오버를 해산해야합니다.