我有一个普通的UIViewController
,所有我的UIViewsControllers
都会继承它以重用一些共同操作。
我想在这个“Common”UIViewController
上设置一个segue,以便所有其他UIViewControllers
都可以继承它。
我正在尝试找出如何以编程方式实现这一点。
我猜问题也可以是如何为所有UIViewControllers
设置一个segue,而不用手动进入story board进行设置。
我有一个普通的UIViewController
,所有我的UIViewsControllers
都会继承它以重用一些共同操作。
我想在这个“Common”UIViewController
上设置一个segue,以便所有其他UIViewControllers
都可以继承它。
我正在尝试找出如何以编程方式实现这一点。
我猜问题也可以是如何为所有UIViewControllers
设置一个segue,而不用手动进入story board进行设置。
我想我可以提供另一种可能性。你可以使用一个不附加到操作的segue将storyboard中的两个场景连接起来,然后在你的视图控制器中以编程方式触发segue。具体做法是,在分界面场景底部的文件所有者图标处拖动,并右键拖动到目标场景。我会放一张图片来帮助说明。
会弹出“手动跳转”的选项。我选择了Push类型。点击小方块并确保你在属性检查器中。给它一个标识符,在代码中引用它。
好的,接下来我将使用编程方式的工具栏按钮进行Segue。 在viewDidLoad或其他地方,我将使用以下代码在导航栏上创建一个按钮项:
UIBarButtonItem *buttonizeButton = [[UIBarButtonItem alloc] initWithTitle:@"Buttonize"
style:UIBarButtonItemStyleDone
target:self
action:@selector(buttonizeButtonTap:)];
self.navigationItem.rightBarButtonItems = @[buttonizeButton];
注意选择器是buttonizeButtonTap:。因此,为该按钮编写一个无返回值的方法,并在该方法中调用segue,如下所示:
好的,请注意选择器是 buttonizeButtonTap:。因此,您需要为该按钮编写一个 void 方法,在该方法内部调用 segue,代码如下:
-(void)buttonizeButtonTap:(id)sender{
[self performSegueWithIdentifier:@"Associate" sender:sender];
}
当调用prepareForSegue时,sender参数是必需的,以标识按钮。prepareForSegue是框架方法,在该方法中您将实例化场景并传递它需要执行其工作所需的任何值。这是我的方法示例:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"Associate"])
{
TranslationQuizAssociateVC *translationQuizAssociateVC = [segue destinationViewController];
translationQuizAssociateVC.nodeID = self.nodeID; //--pass nodeID from ViewNodeViewController
translationQuizAssociateVC.contentID = self.contentID;
translationQuizAssociateVC.index = self.index;
translationQuizAssociateVC.content = self.content;
}
}
我进行了测试,它可以正常工作。
UIStoryboardSegue
。你无法以编程方式创建segue - 是故事板运行时为您创建它们。通常情况下,您可以在视图控制器的代码中调用performSegueWithIdentifier:
,但这需要有一个已经设置好引用的segue存在于storyboard中。- (IBAction)pushMyNewViewController
{
MyNewViewController *myNewVC = [[MyNewViewController alloc] init];
// do any setup you need for myNewVC
[self presentModalViewController:myNewVC animated:YES];
}
然后在您的派生类中,在适当的按钮被点击或表格行被选中时调用该方法。
performSegueWithIdentifier:sender:
的 UIViewController
方法来实现。 - jonkrollUIView
зљ„presentModalViewController:animated:
е·Іиў«ејѓз”ЁгЂ‚д»Ћж–‡жЎЈдёеЏЇд»Ґзњ‹е€°пјЊ*(ењЁiOS 6.0дёе·Іиў«ејѓз”ЁпјЊиЇ·ж”№з”ЁpresentViewController:animated:completion:
д»Јж›їгЂ‚)* - user我一直在使用这段代码来实例化我的自定义segue子类并以编程方式运行它。它似乎起作用了。这样做有什么问题吗?我感到困惑,因为其他所有答案都说这样做不可能。
UIViewController *toViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"OtherViewControllerId"];
MyCustomSegue *segue = [[MyCustomSegue alloc] initWithIdentifier:@"" source:self destination:toViewController];
[self prepareForSegue:segue sender:sender];
[segue perform];
UIStoryboardSegue
的定制子类。 - Jean-Philippe PelletperformSegueWithIdentifier:
的ID确实在故事板中定义。如果我自己创建转场,就可以避免所有问题。 - Jean-Philippe Pellet看起来这个问题已经得到回答并被接受,但我想补充一些细节。
为了解决一个问题,在该问题中,我会首先呈现登录视图作为第一个屏幕,然后如果登录正确,希望跳转到应用程序。 我从登录视图控制器创建了segue到根视图控制器,并赋予了一个标识符,比如“myidentifier”。
然后,在检查所有登录代码是否正确的情况下,如果登录正确,我会调用
[self performSegueWithIdentifier: @"myidentifier" sender: self];
我最大的误解是尝试将segue放在按钮上,并在找到segue后中断它。
你需要将代码连接到你正在使用的 UIStoryboard
上。确保进入你的 UIStoryboard
中的 YourViewController,单击其周围的边框,然后设置其 identifier
字段为一个 NSString
,在代码中调用它。
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard"
bundle:nil];
YourViewController *yourViewController =
(YourViewController *)
[storyboard instantiateViewControllerWithIdentifier:@"yourViewControllerID"];
[self.navigationController pushViewController:yourViewController animated:YES];
对于在故事板中的控制器。
jhilgert00这就是你要找的吗?
-(IBAction)nav_goHome:(id)sender {
UIViewController *myController = [self.storyboard instantiateViewControllerWithIdentifier:@"HomeController"];
[self.navigationController pushViewController: myController animated:YES];
}
或者...
[self performSegueWithIdentifier:@"loginMainSegue" sender:self];
故事板Segue不能在故事板之外创建。尽管存在缺点,您仍需要将其连接起来。
UIStoryboardSegue参考清楚地说明:
您不会直接创建segue对象。相反,当运行时必须在两个视图控制器之间执行segue时,故事板运行时会创建它们。如果您想要的话,仍然可以使用UIViewController的performSegueWithIdentifier:sender:方法以编程方式启动segue。您可能会这样做,以从以编程方式添加并因此在Interface Builder中不可用的源启动segue。
您仍然可以使用presentModalViewController:
或pushViewController:animated:
调用以编程方式告诉故事板呈现视图控制器,但是您需要一个故事板实例。
您可以调用UIStoryboard
的类方法,以获取具有主束的nil的命名故事板。
storyboardWithName:bundle:
prepareForSegue:sender:
方法触发的。但事实并非如此。无论您是否为(出发的)视图控制器实现了prepareForSegue:sender:
方法,故事板的segue都会执行。prepareForSegue:sender:
方法,则segue仍将转换到目标视图控制器。但它将未经准备地转换到该视图控制器。你可以创建并且继承UIStoryBoardSegue。 继承通常用于提供自定义转场动画。
你可以在YouTube上观看2011年WWDC介绍StoryBoard的视频。
首先,假设您在故事板中有两个不同的视图,并且您希望从一个屏幕导航到另一个屏幕,请按照以下步骤操作:
1). 使用类文件和身份检查器中的故事板ID定义所有视图。
2). 确保将导航控制器添加到第一个视图中。在Storyboard中选择它,然后选择Editor > Embed In > Navigation Controller
3). 在第一个类中,导入“secondClass.h”
#import "ViewController.h
#import "secondController.h"
4). 在执行segue的IBAction中添加此命令
secondController *next=[self.storyboard instantiateViewControllerWithIdentifier:@"second"];
[self.navigationController pushViewController:next animated:YES];
5). @"second"
是指 secondview controller 类和 storyboard id。
self.storyboard
should be: UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
- masipcatstoryboardWithName:@“Main”
。 - ammianus[self showDetailViewController:next sender:self];
或 [self showViewController:next sender:self];
来显示下一个视图。 - ammianus