2015-08-16 25 views
5

Bu hafta sonu tüm bu problemlerle uğraşıyordum ve uzun zamandır sorunsuz bir şekilde çözüm bulmaya çalıştım.UIPageViewController sayfa dizinini takip etmiyor

Kullanım durumum oldukça basit ve böylesine önemsiz bir davranışın doğru şekilde yapılmasının ne kadar zor olduğuna inanamıyorum.

Uygulamam, kullanıcıların bir sonraki veya bir önceki sayfayı görmek için sola veya sağa kaydırdığı basit bir pürüzlü akışdır. UIPageViewController'ım var ve her sayfada bir UITableView var. Ben nedenlerle viewControllerAfterViewController ve viewControllerBeforeViewController fonksiyonları iç sayfa endeksinin takip çalışıyorum problemler burada açıklandığı oldu: Ben willTransitionToViewControllers ve iç indeksi takip bu soruna (tüm önerilen çözümlerden aşağıdaki denedim PageViewController delegate functions called twice

didFinishAnimating) ama bu benim viewController * ViewController işlevleri hala bir viewController döndürmek zorundadır ve başlangıçta iki kez denir beri ilk viewController kullanılan alır ve ikinci geçiş görünmüyor gibi görünüyor gibi benim sorunumu çözmez herhangi bir etkisi olması.

Bu sorunla ilgili birçok soru ve blog görmeme rağmen, viewController * ViewController işlevlerinden doğru viewController öğesini sürekli olarak nasıl döndüreceğinizi gösteren bir örnek görmedim ve bir örnek için büyük bir minnettar olacaktır. Bir çözüm göremediğim asıl sorun, içeriği yalnızca sayfa yükünde dinamik olarak güncellenen tek bir viewController varsa, willTransitionToViewControllers içindeki bir sonraki dizinin nasıl belirleneceğidir. Bana tavuk ve yumurta problemi gibi geliyor; Sayfayı hangi içerikle güncelleyeceğimi anlamaya ihtiyacım var, ancak bunu yapmak için sayfanın dizininin ne olduğunu (içeriğin bir parçası) bilmem gerekiyor.

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    _pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController"]; 
    _pageViewController.dataSource = self; 
    _pageViewController.delegate = self; 
    [self.view addSubview:_pageViewController.view]; 

    PageContentViewController *startingPage = [self viewControllerAtIndex:0]; 

    NSArray *viewControllers = @[startingPage]; 
    [_pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; 

} 

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { 
    // Don't do any index calculations as the result is inconsistent 
    return [self viewControllerAtIndex:nextIndex]; 
} 

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { 
    // Don't do any index calculations as the result is inconsistent 
    return [self viewControllerAtIndex:nextIndex]; 
} 

- (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers { 
    // This value never changes because the global _pageViewContentController hasn't been updated yet 
    nextIndex = [((PageContentViewController *)pendingViewControllers[0]) pageIndex]; 
} 

- (PageContentViewController *)viewControllerAtIndex:(NSUInteger)index { 
    _pageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageContentViewController"]; 
    _pageContentViewController.pageIndex = index; 
    _pageContentViewController.title = index; 

    return _pageContentViewController; 
} 

Ben bu işlevler doğru verilerle doldurulması denilen olsun ve küresel _pageViewContentController beklenebilir sırayı debug ettik:

Düzenleme İşte etkilenen kod damıtılmış versiyonu sayfa değiştikten sonra.

Edit 2 Sorunumla ilgili daha fazla ayrıntı vermek için; sayfalarımın her biri bir başlık ve bir web bağlantısı tablosu içerir. Bir linke tıkladığınızda seçilen web sayfasını görüntülemek için bir WebViewController açılır. Yunus'un çözümüyle, her şey doğru bir şekilde görüntüleniyor (başlık ve bağlantılar beklendiği gibi görünür) ancak sorun, bir sonraki sayfadan bir link yükledikçe bir bağlantıya tıklandığında ortaya çıkar. Sayfanın görüntü oluşturma aşaması verilerin doğru olduğu noktada gerçekleşmiş gibi görünmektedir, ancak sonra sayfa içeriği denetleyicisini, işlem tamamlandıktan sonra yanlış verilerle yeniden başlatır, bu nedenle gerçek bağlantı verileri yanlıştır (işlenen veriler iyi olsa da)).

+0

Kodunuzun bazı ilgili bölümlerini paylaşabilir misiniz? –

+0

@YunusErenGuzel - kod parçacıkları eklendi. – bobby

+0

Bu WebViewController'ı nasıl açıyorsunuz? UIPageViewController içinde veya modal veya etc? –

cevap

3

en

self.contentViewControllers = [NSMutableArray new]; 
for(int i=0; i< MAX_INDEX; i++) { 
    [self.contentViewControllers addObject:[self viewControllerAtIndex:0]]; 
} 

Sonra yapmanız gereken bir dizideki tüm ilgili contentViewControllers tutalım Peşinde ve yöntemlerde Sonra

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController 
    viewControllerBeforeViewController:(UIViewController *)viewController 
{ 

    for(int i=0;i<self.contentViewControllers.count ;i++) 
    { 
    if(viewController == [self.contentViewControllers objectAtIndex:i]) 
    { 
     if(i-1 >= 0) 
     { 
     return [self.contentViewControllers objectAtIndex:i-1]; 
     } 
    } 
    } 
    return nil; 
} 

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController 
     viewControllerAfterViewController:(UIViewController *)viewController 
{ 

    for(int i=0;i<self.contentViewControllers.count ;i++) 
    { 
    if(viewController == [self.contentViewControllers objectAtIndex:i]) 
    { 
     if(i+1 < self.contentViewControllers.count) 
     { 
     return [self.contentViewControllers objectAtIndex:i+1]; 
     } 
    } 
    } 
    return nil; 
} 

önce göstermelidir hangi görüntülemek kontrolör karar vermektir geçiş yöntemi

- (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers 
{ 
    UIViewController* viewController = [pendingViewControllers objectAtIndex:0]; 
    NSInteger nextIndex = [self.contentViewControllers indexOfObject:viewController]; 
    [self.pageControl setCurrentPage:nextIndex]; 
} 
+0

Merhaba Yunus. Yardım ettiğin için teşekkür ederim. Önerinizi denemek için kodumu değiştirdim (bu haftasonu üzerinde denediğim ama başarılı olamadığım bir şey). Örneğinizde, nextIndex değerini ayarlıyorsunuz, ancak hiçbir zaman hiçbir yerde kullanılmıyor. Burada bir şey mi eksik? – bobby

+0

Aslında kullanmak istediğin için bunu boş tutuyorum. İndeksi [self.pageControl setCurrentPage: nextIndex]; ' –

+0

ile tutmak için SMPageControl ile kullanıyorum. Nasıl çalıştığını görmek için bu ViewController'ı kullanabilirsiniz. https://github.com/yunuserenguzel/sonicraph-ios/blob/master/sonicraph/View%20Controllers/SNCGoThroughViewController.m –

İlgili konular