1

IBAction 버튼으로 페이지 뷰 컨트롤러를 닫으려고합니다. 뷰 (PageContentViewController)를 닫을 수 있습니다. 새 뷰 (LoginViewController)가 표시되지만 페이지 컨트롤의 "점"은 여전히 ​​여기에 있습니다. , 나는 새로운 관점 (LoginViewController)과 통신 할 수 없다. 내가 뭘 잘못하고 있니?페이지 뷰 컨트롤러로 removeFromSuperView

LoginViewController.h :

#import "PageContentViewController.h" 
@interface LoginViewController : UIViewController <UIPageViewControllerDataSource> 
@property (strong, nonatomic) UIPageViewController *pageViewController; 
@property (strong, nonatomic) NSArray *pageTitles; 
@property (strong, nonatomic) NSArray *pageImages; 
@end 

LoginViewController.m :

- (void)viewDidLoad 
    { 
    [super viewDidLoad]; 
     // Create the data model 
     _pageTitles = @[@"Over 200 Tips and Tricks", @"Discover Hidden Features", @"Bookmark Favorite Tip", @"Free Regular Update"]; 
     _pageImages = @[@"FIRST_img.jpg", @"FIRST_img.jpg", @"FIRST_img.jpg", @"FIRST_img.jpg"]; 

     // Create page view controller 
     self.pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController"]; 
     self.pageViewController.dataSource = self; 

     PageContentViewController *startingViewController = [self viewControllerAtIndex:0]; 
     NSArray *viewControllers = @[startingViewController]; 
     [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; 



     // Change the size of page view controller 
     self.pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 30); 

     [self addChildViewController:_pageViewController]; 
     [self.view addSubview:_pageViewController.view]; 
     [self.pageViewController didMoveToParentViewController:self]; 

    } 


- (PageContentViewController *)viewControllerAtIndex:(NSUInteger)index 
{ 
    if (([self.pageTitles count] == 0) || (index >= [self.pageTitles count])) { 
     return nil; 
    } 

    // Create a new view controller and pass suitable data. 
    PageContentViewController *pageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageContentViewController"]; 
    pageContentViewController.imageFile = self.pageImages[index]; 
    pageContentViewController.titleText = self.pageTitles[index]; 
    pageContentViewController.pageIndex = index; 

    return pageContentViewController; 
} 


#pragma mark - Page View Controller Data Source 

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController 
{ 
    NSUInteger index = ((PageContentViewController*) viewController).pageIndex; 

    if ((index == 0) || (index == NSNotFound)) { 
     return nil; 
    } 

    index--; 
    return [self viewControllerAtIndex:index]; 
} 

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController 
{ 
    NSUInteger index = ((PageContentViewController*) viewController).pageIndex; 

    if (index == NSNotFound) { 
     return nil; 
    } 

    index++; 
    if (index == [self.pageTitles count]) { 
     return nil; 
    } 
    return [self viewControllerAtIndex:index]; 
} 

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController 
{ 
    return [self.pageTitles count]; 
} 

- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController 
{ 
    return 0; 
} 

PageContentViewController.h :

@interface PageContentViewController : UIViewController 
@property (weak, nonatomic) IBOutlet UIImageView *backgroundImageView; 
@property (weak, nonatomic) IBOutlet UILabel *titleLabel; 
@property NSUInteger pageIndex; 
@property NSString *titleText; 
@property NSString *imageFile; 
- (IBAction)dismissButton:(id)sender; 
@end 

PageContentView 여기

내 코드입니다 Controller.m :

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.backgroundImageView.image = [UIImage imageNamed:self.imageFile]; 
    self.titleLabel.text = self.titleText; 

} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (IBAction)dismissButton:(id)sender { 
    [self.view performSelectorOnMainThread:@selector(removeFromSuperview) withObject:nil waitUntilDone:NO]; 
    [self performSelectorOnMainThread:@selector(removeFromParentViewController) withObject:nil waitUntilDone:NO]; 


} 
@end 

답변

2

PageContentViewController는 제거하지만 아직 PageViewController는 삭제하지 않습니다.

... dismissButton 방법 [self.view.superview에 사용하려고 편집 :

좋은 방법은 표준 코드로 부모로부터 부모를 제거하는 것입니다 :

[self willMoveToParentViewController:nil]; 
    [self.view removeFromSuperview];    
    [self removeFromParentViewController]; 

그러나

[self.parentViewController willMoveToParentViewController:nil]; 
    [self.parentViewController.view removeFromSuperview];    
    [self.parentViewController removeFromParentViewController]; 

또는 [self.parentViewController.parentViewController ... 그것은 depe : 당신은 다음과 같은 코드를 사용하려고하면, 자식에서 부모를 제거하는 방법은 무엇으로 그것을 할 계층 구조의 nds.

+0

답장을 보내 주셔서 감사합니다. 나는 "[self.view performSelectorOnMainThread : @selector (removeFromSuperview) withObject : nil waitUntilDone : NO];를" "with [self.view.superview performSelectorOnMainThread : @selector (removeFromSuperview) withObject : nil waitUntilDone : NO];" 그러나 그것은 같은 문제입니다 : ... ( – Viny76

+0

업데이트 답변) – kabarga

+0

고마워요! 그건 완벽하게 작동합니다! – Viny76