2016-10-28 4 views
0

Ich habe drei Registerkartencontroller. Von diesen Registerkarten-Controllern gibt es Schaltflächen, um zu verschiedenen Ansichten zu gelangen. Einige dieser Ansichten gelten für andere Ansichtscontroller, die mit den Tab-View-Controllern übereinstimmen, andere nicht. Diese verschiedenen Ansichten wiederum können zu anderen Ansichten führen. In Wirklichkeit könnte ein Benutzer auf diese Weise für immer neue Ansichten zuweisen. Die drei Hauptansichten sind NewsFeedVC ProfileVC und NotificationsVC. Dann enthält die sekundäre Ansicht "VotesListVC". Die beabsichtigte Verwendung besteht darin, dass ein Benutzer eine der drei Registerkarten auswählen und fortfahren kann, mehr View-Controller auf dem Stapel zu öffnen. Der Benutzer kann entweder die Navigation Zurück-Taste bis zur ursprünglichen Ansicht drücken oder eine andere Registerkarte drücken. Wenn Sie auf die andere Registerkarte tippen, sollte der Stapel von View-Controllern auf dem vorherigen Stapel freigegeben werden. Wenn Sie zur ursprünglichen Registerkarte zurückkehren, wird der Root-View-Controller angezeigt. Das Problem ist, dass mein Code unerhört hässlich geworden ist, als ich herausgefunden habe, welcher View Controller zuletzt war. In dieser App habe ich das Storyboard deaktiviert, sodass ich die gesamte Navigation selbst machen muss. Meine Frage ist, was ist der richtige Weg zu wissen, was auf dem Stapel ist und wie man es entfernt. Hier ist ein Teil des Codes, den ich verwende.mehrere Aufrufe zum Navigationsstapel

//for when the user wants to leave an individual post allViewControllers is an array  
NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray: self.navigationController.viewControllers]; 

-(void)backTapped{ 
if (_postKey) { 
    ActivityViewController *newVC = [allViewControllers objectAtIndex:1]; 
    [allViewControllers insertObject:newVC atIndex:0]; 
    [allViewControllers removeLastObject]; 
    self.navigationController.viewControllers = allViewControllers; 

    CATransition* transition = [CATransition animation]; 
    transition.duration = 0.2f; 
    transition.type = kCATransitionPush; 
    transition.subtype = kCATransitionFromLeft; 
    [self.navigationController.view.layer addAnimation:transition 
               forKey:kCATransition]; 
    [self.navigationController popViewControllerAnimated:NO]; 
} 
} 


//Here is how I handle leaving the profileVC, I have booleans determining what view it is from. 

-(void)backTapped{ 

if (fromWorldFeed) { 
    WorldFeedViewController *newVC = [allViewControllers objectAtIndex:1]; 
    newVC.retainTablePosition=true; 
    [allViewControllers insertObject:newVC atIndex:0]; 
    [allViewControllers removeLastObject]; 
    self.navigationController.viewControllers = allViewControllers; 

    [self.navigationController popViewControllerAnimated:NO]; 
}else if(_fromActivity){ 
    ActivityViewController *newVC = [allViewControllers objectAtIndex:1]; 
    [allViewControllers insertObject:newVC atIndex:0]; 
    [allViewControllers removeLastObject]; 
    self.navigationController.viewControllers = allViewControllers; 
}else{ 
    VotesListViewController *newVC =[allViewControllers objectAtIndex:1]; 
    [allViewControllers insertObject:newVC atIndex:0]; 
    [allViewControllers removeLastObject]; 
    self.navigationController.viewControllers =allViewControllers; 
} 
CATransition* transition = [CATransition animation]; 
transition.duration = 0.2f; 
transition.type = kCATransitionPush; 
transition.subtype = kCATransitionFromLeft; 
[self.navigationController.view.layer addAnimation:transition 
              forKey:kCATransition]; 
[self.navigationController popViewControllerAnimated:NO]; 
} 

ich speichern Sie die Tab-Leiste Index, wenn es auch zu wissen, lädt, wenn sie sich ändert und dann kann ich loslassen irgendwie die alten Registerkarten Stapel anzuzeigen.

-(void)setTabBarIndex{ 
NSInteger tabBarIndex =self.tabBarController.selectedIndex; 
NSString *tabBarStr=[@(tabBarIndex) stringValue]; 
[[NSUserDefaults standardUserDefaults]setObject:tabBarStr forKey:@"tabBarIndex"]; 

}

Dieser Code wäre schön, wenn der Benutzer nur auf eine oder zwei Ansichten höchstens navigieren kann. Allerdings habe ich Probleme, die schwer zu erklären sind, wenn der Benutzer tief in die App einsteigt. Gibt es eine Art, wie ich meinen App-Delegierten das verwalten lassen kann?

+0

Warum haben Sie nicht einen Navigations-Controller pro Registerkarte und dann, wenn Sie Tabs wechseln, müssen Sie nur den vorherigen aktiven Registerkarten-Navigation-Controller zu seinem Stamm zu knallen. – Paulw11

Antwort

1

Wie Sie bereits erwähnt haben Sie drei Registerkarten in Ihrem UITabBarController. Nimm also zuerst drei UINavigationController. NewsFeedVC, ProfileVC und NotificationsVC sind die rootViewController s für diese drei UINavigationControllers.

newsFeedNavigationController = [[UINavigationController alloc] initWithRootViewController:yourNewsFeedVCObject]; 
profileNavigationController = [[UINavigationController alloc] initWithRootViewController:yourProfileVCObject]; 
notificationsNavigationController = [[UINavigationController alloc] initWithRootViewController:yourNotificationsVCObject]; 

yourTabBarController.viewControllers = @[newsFeedNavigationController, profileNavigationController, notificationsNavigationController]; 

Nun, wenn Sie eine neue View-Controller angezeigt werden möchten, können Sie einfach die View-Controller drücken, die jeweilige Navigationssteuerung den Stapel verarbeiten.

Angenommen, Sie haben die Registerkarte "Newsfeed" ausgewählt, daher ist der aktuelle Navigationscontroller newsFeedNavigationController. Jetzt möchten Sie einen View-Controller, A, darauf schieben. Drücken Sie einfach das Objekt des View-Controllers A auf diesen Navigationscontroller. Wenn Sie ein Objekt von ProfileVC oder NotificationVC auf diesen Navigationscontroller übertragen möchten, müssen Sie den Wert von tabBarController.selectedIndex nicht ändern/aktualisieren. Weil Sie das Objekt von ProfileVC oder NotificationVC auf newsFeedNavigationController verschoben haben und Sie sich immer noch auf diesem Navigationscontroller befinden. Dies ist normales Verhalten der iOS App.

Ansicht Controller-Stack von newsFeedNavigationController, profileNavigationController und notificationsNavigationController wird anders sein. Push/Pop wird auf den Navigationscontrollern ausgeführt, wie Sie es benötigen (Sie möchten einen View-Controller anzeigen, den Sie drücken möchten, um zurück zu gelangen). Sie müssen sie nicht mischen.

Verwandte Themen