您好我是iOS的新手,对于浏览我的观点有疑问。
我正在使用IB连接导航栏中的PREVIOUS和NEXT按钮来推送我的视图。一切正常。但是我无法找到我需要做什么或者我需要放置代码的位置,以便我可以跳过视图。为了简化我的情况......
- 我有1个Nav控制器和4个名为VC1,VC2,VC3,VC4的视图控制器。每个VC都有一个.H / .M - 从VC1开始,他们一个接一个地跟着。
假设我想跳过VC3并根据VC2中的设置直接跳转到VC4。我会把代码放在哪里?我是否需要从VC3的NAV按钮取消IBAction方法?
如果之前已经介绍过,我会道歉。如果有啧啧或者您知道有回复此帖的帖子,请告诉我。我确实进行了搜索,但搜索返回了通用帖子,可能是因为我使用了错误的术语。
提前致谢。
答案 0 :(得分:1)
有几点想法:
如果你想从VC2推送到VC3或VC4,而不是让VC3在特殊情况下立即推送到VC4,我认为将VC2直接推送到适当的视图控制器会更好。因此,VC2中可能有IBAction
可以为您执行此操作:
- (IBAction)pushToNext:(id)sender
{
BOOL skipToVC4 = ... // put in whatever logic you'd use to bypass VC3 and go directly to VC4
UIViewController *nextController;
if (skipToVC4)
{
nextController = [self.storyboard instantiateViewControllerWithIdentifier:@"VC4"];
// obviously, if using NIBs, you'd do something like:
// nextController = [[ViewController4 alloc] initWithNibName:@"VC4" bundle:nil];
}
else
{
nextController = [self.storyboard instantiateViewControllerWithIdentifier:@"VC3"];
}
[self.navigationController pushViewController:nextController animated:YES];
}
这样,当你从VC4弹出时,你会直接回到相应的视图控制器(例如,如果你从VC2推送到VC4,当你弹出时,你会自动弹回到VC2。
显然,如果您使用的是故事板,而不是手动调用pushViewController
,您可以从VC2获得两个segue(一个到VC3,一个到VC4),给它们适当的标识符,然后只需调用performSegueWithIdentifier
转到相应的视图控制器。但是这个想法是一样的:你可以定义一个IBAction
来执行适当的segue,具体取决于你选择的逻辑。
你说你的导航栏中有“PREVIOUS和NEXT按钮推送我的视图”,我想知道你的“PREVIOUS”按钮。这是popViewControllerAnimated
吗?通常,“NEXT”按钮将推送到新的视图控制器,但“PREVIOUS”按钮不应该推到上一个视图,而是弹回到它。如果不弹回,则最终可能会出现一些先前视图控制器的多个实例。因此,“PREVIOUS”按钮应链接到IBOutlet
,其执行类似:
- (IBAction)popToPrevious:(id)sender
{
[self.navigationController popViewControllerAnimated:YES];
}
当弹回时,您显然会弹回到您推送的视图控制器。如果您想要在6.0之前的iOS版本中弹回一些视图控制器,则可以使用popToViewController
或popToRootViewControllerAnimated
。例如,假设您从VC1推送到VC2,再推送到VC3,再推送到VC4。如果你想从VC4一直弹回到VC1,你可以在VC4中连接IBAction
,如:
- (IBAction)popToRoot:(id)sender
{
[self.navigationController popToRootViewControllerAnimated:YES];
}
或者,如果你想从VC4回弹到VC2,你会
- (IBAction)popToVC2:(id)sender
{
for (UIViewController *controller in self.navigationController.viewControllers)
{
if ([controller isKindOfClass:[ViewController2 class]])
{
[self.navigationController popToViewController:controller animated:YES];
return;
}
}
}
如果您将VC2的引用传递给VC3然后再传递给VC4,则可以通过navigationController.viewControllers
避免此迭代,但有时上述技术更容易。
顺便说一句,如果你只支持iOS 6及更高版本,并且正在使用故事板,你也可以使用展开segue,这是一种更优雅的方式,可以弹回特定的视图控制器。但目前尚不清楚(a)你是否正在使用故事板; (b)你只支持iOS 6及以上版本,因此我现在不会讨论放松细分。
答案 1 :(得分:0)
第一:
向我们展示一些代码,您可以在其中推送新的视图控制器,也许是您的整个导航控制器代码
第二(解决方案):
我假设:
我可以为您提供以下帮助:
visibleViewController
@property visibleViewController
应该按下/弹出下一个/上一个视图控制器如果所有控制器VC1 / 2/3/4都是viewController类的子类,那么最好的解决方案就是在它的接口中定义一个方法:
- (Class)nextViewControllerClass;
- (Class)previousViewControllerClass;
并在实施中:
- (Class)nextViewControllerClass {
return [VC4 class];
}
- (Class)previousViewControllerClass {
return [VC1 class];
}
在你的navigationController代码中执行以下操作:
- (IBAction)next:(id)sender {
UIViewController *nextViewController = [[[self.visibleViewController nextViewControllerClass] alloc] init];
[self pushViewController:nextViewController animated:YES];
}