我有问题,我一直坐着.我有一个UIViewController List和一个UIViewController Login.在Login我有一个按钮"Done",同一个UIViewController上的另一个隐藏按钮有一个segue到List(Type:push).我在xcode的接口构建器中为它命名了一个名为"LoginToList"的标识符.现在从另一个类(一个运行的类Login是活动控制器)我调用:
[[Login sharedLogin] performSegueWithIdentifier:@"LoginToList"];
Run Code Online (Sandbox Code Playgroud)
所述Login类显然有与标识符的SEGUE"LoginToList"
但我一直在:
'NSInvalidArgumentException', reason: 'Receiver (<Login: 0x6d79d90>) has no segue with identifier 'LoginToList''
Run Code Online (Sandbox Code Playgroud)
在+ (id) sharedLogin看起来像这样:
+ (id) sharedLogin {
static Login *sharedLogin = nil;
@synchronized(self) {
if (sharedLogin == nil) {
sharedLogin = [[self alloc] init];
}
return sharedLogin;
}
}
Run Code Online (Sandbox Code Playgroud)
如果有人知道为什么会这么说,我会很高兴听到它!:D我不知道我是否遗漏了一些愚蠢的东西,但我无法发现它:(
编辑:我已经在界面生成器中创建了一个segue(ctrl +点击拖动Login到List),使用UIViewControllers自己(Login&List).然后我命名了segue "LoginToList",换句话说我给了它标识符.我点击了segue,在右上角有一个我用过的"Identifier"字段.
我仍然得到错误说Login没有带标识符的segue …
我知道还有很多其他问题,但它们并没有完全解释我的问题.
当按下相关按钮时,我通过识别的故事板自定义segue 从我的初始视图控制器SAGViewController转到另一个视图控制器SAGHomeScreenViewController:
-(IBAction)goNewGame{
[self performSegueWithIdentifier:@"startHomeSegue" sender:self];
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我仍然收到警告:
警告:尝试在SAGViewController上显示SAGHomeScreenViewController:0xc43b800:0xbaaa9f0,其视图不在窗口层次结构中!
如果我注释掉了performSegueWithIndentifer,segue仍然有效,但我没有得到警告:
-(IBAction)goNewGame{
//[self performSegueWithIdentifier:@"startHomeSegue" sender:self];
}
Run Code Online (Sandbox Code Playgroud)
为什么?请注意,我没有导航控制器.
任何建议都会受到赞赏,segue仍然有效,但我不想要任何我不明白的警告!
目前,我的故事板中有两个段落.但是,我需要删除Storyboard中的一个segue.有没有办法通过XCode故事板来做到这一点?
我想在我的故事板中显示(例如推送)segues,以连接我的viewcontrollers和我的导航控制器.然后,viewcontrollers上的导航栏将正确显示.例如:使用show detail或present modaly,导航栏将消失
但我不想要segue动画.Xcode发出如下警告:"在iOS 9.0之前禁用segue动画"
我想要iOS 7.0或8.0的部署目标
我怎么解决这个问题?
提前致谢.
假设我有一个视图控制器,我在点击按钮时使用自适应popover segue显示.现在在某些情况下,我可能想要将目标视图控制器包装在(例如)导航控制器中.所以,我将自己设置为委托popoverPresentationController的委托,并实现该presentationController:viewControllerForAdaptivePresentationStyle:方法.
但我注意到一些奇怪的事情:在某些情况下,对象没有被解除分配.如果,在前面提到的方法中,我将呈现的viewcontroller包装在导航控制器中:
func presentationController(controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? {
return UINavigationController(rootViewController: controller.presentedViewController)
}
Run Code Online (Sandbox Code Playgroud)
在解除时,导航控制器被取消分配,但是呈现的视图控制器仍然被分配.
相反,如果我通过自适应popover segue直接显示导航控制器,那么在解除导航控制器和它包含的细节控制器时,将正确释放.
出于演示目的,请参考此测试项目(Swift):https://github.com/djbe/AdaptivePopoverSegue-Test
动态包装在导航控制器中时我们得到的结果(点击"弹出,导航自动添加"按钮):
--- Showing details ---
Loaded details view controller (0x7fab31632b70)
Loaded navigation controller (0x7fab32815600)
Deinit navigation controller (0x7fab32815600)
Run Code Online (Sandbox Code Playgroud)
如您所见,详细信息视图控制器永远不会被释放.
我检查了文档,presentationController:viewControllerForAdaptivePresentationStyle:但没有具体提及所有权,强保留等等...我尝试使用带有分配工具的仪器,但是这个(简单)案例中有很多保留/释放我不能直接找到问题.
有没有人遇到过这个问题?或者您对如何解决这个问题有所了解?
如下面@TomSwift所述,由于控制器和segue之间的循环引用,存在一个错误.解决此问题的唯一方法是将目标控制器包装在导航控制器中,方法是在segue(自定义)的init方法中进行换行.
我已经在Github上更新了我的示例代码,以展示如何使用@Vasily提到的解决方案实现这一目标,但仍允许使用协议进行动态包装行为,而无需使用NSUserDefaults进行hacky变通办法.
在我的故事板中,我有一个视图作为启动画面.在这个视图中,我已经有一个像"打开应用程序"的按钮,它打开菜单视图,带有模态segue.但是我也希望屏幕自动执行segue,就像2秒后出现视图一样.
一些代码在这里:
- (void)viewDidAppear:(BOOL)animated
{
[self performSegueWithIdentifier:@"splashScreenSegue" sender:self];
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我已经使用performSegueWithIdentifier但它立即执行.有没有办法让它延迟?
提前致谢.
我正在使用此函数在Xcode 4.3中切换视图.
[self performSegueWithIdentifier:@"NextView" sender:self];
Run Code Online (Sandbox Code Playgroud)
我想在页面之间传递一些参数.我怎样才能做到这一点?
properties uiviewcontroller ios uistoryboard uistoryboardsegue
我是iOS开发的新手,我正在尝试同时学习故事板,Swift和iOS 8的新功能.
我创建了一个非常简单的故事板,使用Popover演示文件segue来显示另一个视图.在模拟器上,如果我为iPad运行它,它按预期工作.但是,如果我为iPhone而不是弹出窗口运行它,它会在原始视图的顶部显示全屏视图.这可以; 但是,没有办法解雇它并回到原来的屏幕.
我观看了WWDC 2014视频"228 A Look inside presentation controllers",如果他们完全使用代码构建用户界面,他们可以显示一个关闭按钮.
我还看过"411界面构建器中的新功能"会话,他们说这可以在Interface Builder中完成,但他们没有显示它,承诺在实验室中展示如何做,如果有人感兴趣的话.不幸的是,我没有参加WWDC 2014,或者认识任何人.我的Google搜索也没有返回任何有用的内容.
我创建了一个表视图,然后从那里开始说用户按下了一个单元格,它将转到detailItemView,但现在唯一的问题是每当用户在detailItemView中时,没有后退按钮,即使我已经嵌入了导航控制器
这是用户按下单元格后将执行segue的代码:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// Get the new view controller using [segue destinationViewController].
var nav = segue.destinationViewController as! UINavigationController
var detailScene = nav.topViewController as! DetailViewController
// Pass the selected object to the destination view controller.
if let indexPath = self.tableView.indexPathForSelectedRow() {
let row = Int(indexPath.row)
detailScene.currentObject = objects?[row] as? PFObject
}
}
Run Code Online (Sandbox Code Playgroud)
故事板的屏幕截图:

编辑截图

我试着在下面做出答案,但仍然没有后退按钮
另一个截图,detailView控制器没有后退按钮

请原谅我的初学者问题.我知道我可以像这样切换到另一个屏幕(ViewController)
self.performSegueWithIdentifier ("SecondViewController", sender: self)
Run Code Online (Sandbox Code Playgroud)
但我似乎无法找到在哪里指定我的第二个屏幕的id,我只是找到了Storyboard ID,是吗?
我已经尝试过,只是因为以下错误而收到了崩溃:
Receiver()没有带标识符'SecondViewController'的segue
任何的想法?谢谢
ios ×7
uistoryboard ×5
swift ×4
objective-c ×3
segue ×3
xcode ×3
ios5 ×1
ios8 ×1
iphone ×1
popover ×1
properties ×1
uitableview ×1