我有a small iPhone app个,它使用一个导航控制器来显示3个视图(这里有fullscreen个):

Xcode屏幕截图

首先,它显示社交网络列表(Facebook、Google+等):

列表截图

然后,它会显示一个OAuth对话框,询问凭据:

登录屏幕截图

以及(在此之后,在相同的UIWebView中)权限:

权限屏幕截图

最后,它会显示带有用户详细信息的最后一个视图控制器(在真正的应用程序中,这将是菜单,可以在其中启动多人游戏):

详细屏幕截图

这一切都很好,但我有一个问题,当用户想要返回并 Select 另一个社交网络时:

用户点击后退按钮,第一个视图不再显示,而是显示第二个视图,再次请求OAuth凭据/权限.

我能在这里做什么?Xcode 5.0.2对segues的 Select 非常有限——pushmodal(我不能使用它,因为它遮挡了我游戏所需的导航栏)和custom.

我是一个iOS编程新手,但之前我开发了一个Adobe AIR mobile app,可以1)替换视图而不是推,2)从导航堆栈中删除不需要的视图.

如何在本地应用程序中实现同样的功能?

推荐答案

您可以使用自定义segue:要做到这一点,您需要创建一个子类UIStoryboardSegue(例如MyCustomSegue),然后您可以用类似这样的内容覆盖"perform"

-(void)perform {
    UIViewController *sourceViewController = (UIViewController*)[self sourceViewController];
    UIViewController *destinationController = (UIViewController*)[self destinationViewController];
    UINavigationController *navigationController = sourceViewController.navigationController;
    // Pop to root view controller (not animated) before pushing
    [navigationController popToRootViewControllerAnimated:NO];
    [navigationController pushViewController:destinationController animated:YES];    
}

此时,转到Interface Builder, Select "custom"segue,并输入类的名称(例如MyCustomSegue)

迅速地

override func perform() {
    if let navigationController = self.source.navigationController {
        navigationController.setViewControllers([self.destination], animated: true)
    }
}

Objective-c相关问答推荐

Objective-C:为什么[对象复制]的两个请求返回相同的结果?

如何测试 NSCFBolean 值?

单元测试私有方法 - 目标 C

带有 IB_DESIGNABLE 的 UIButton 会引发运行时属性警告,并且不会在 Interface Builder 中呈现

从 NSString 创建 SHA1 哈希

在 NSData 和 base64 字符串之间转换

重复符号 _OBJC_METACLASS_$_ClassName

在 iOS 和 Mac OS X 应用程序中使用 C++

滚动后检测 UITableView 中的当前顶部单元格

Swift 3 - dynamic vs @objc

如何在 Objective-C 中创建一个空白的透明 png?

Objective-C:前向类声明

Modal segue,导航栏消失

计算 UILabel 文本大小

当 UIView 框架更改时,视图内的 AVPlayer 层不会调整大小

如何配置我的应用程序 - 菜单项被禁用?

UIWebView 委托方法 shouldStartLoadWithRequest:在 WKWebView 中等效?

iOS:开源 VoIP/SIP Objective-C 代码

iPhone - dequeueReusableCellWithIdentifier 用法

AVAudioPlayer 不播放任何声音