4

我对 iOS 开发比较陌生,并且正在计划一个应用程序。该应用程序将有几个不同的场景/视图控制器,它们将占据整个屏幕。

我打算在屏幕的左上角始终有一个小按钮,它可以将用户带回主页,无论当前显示的是哪个 vc。

我可以在每个 viewController 的视图中放置一个单独但相同的按钮,但这似乎不优雅且脆弱。

阅读 View Controllers Programming guide 后,我的直觉是创建一个 View Controller Container,它将作为根 vc - 这个 vc 将有两个子 vcs - 一个带有主页按钮,另一个位于所有其他 VC 进入的下方(有效地成为新的根 vc。)

对于更有经验的 iOS 开发人员来说,这似乎是一个明智的解决方案吗?有没有更简单的解决方案?

谢天谢地收到任何建议。

4

2 回答 2

1

我认为这可能是您最好的解决方案。在 iOS 中,ViewController 占用了它所有的可用空间。如果没有您自己管理的“容器”视图,您放置的任何视图控制器都将占据整个窗口,覆盖您显示的任何内容。

但是,根据您的项目,还有一种可能更简单的替代方法。

您可以在某个中心位置(例如,您的 App Delegate 类)创建一个 UIView 对象(您的按钮)。该视图可能有一个附加到方法的按钮:

@implementation AppDelegate

- (void) someSetupMethod {
    UIButton* b = [UIButton buttonWithType:UIButtonTypeCustom];
    // setup whatever properties

    // Now set button to call a method *on this AppDelegate object* ("self"):
    [b addTarget:self action:@selector(homeButtonTapped:) forControlEvents:UIControlEventTouchUpInside];

    // Store the button definition somewhere permanant
    self.reusableHomeButton = b;
}

- (void) homeButtonTapped:(id)sender {
    // do something to pop view controllers back to what you want.
}

然后,在您的视图控制器中,它们都可以在出现时显示主页按钮:

- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    AppDelegate* appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
    [self.view addSubview:appDelegate.reusableHomeButton];
}

这利用了一个有意的副作用,[view addSubview:...]即如果视图已经在某个父视图中,它首先将其从该父视图中删除,然后添加到新视图中。

它还利用了按钮可以将其消息发送到任何对象的事实。它不必是承载按钮父视图的 ViewController。

这会导致您的按钮在出现新控制器时从一个显示的视图控制器的 .view 中“移动”到新的。

由于该按钮具有 AppDelegate 对象的目标(因此会将其消息发送到该对象),因此只要应用程序委托对象存在以接收消息,它就可以“从任何地方”工作(只要您的应用程序在跑)。

于 2013-03-10T20:43:51.003 回答
0

使用 Swift,您可以获得协议和协议扩展的强大功能。我写了一篇关于这种方法的文章。简而言之,您将需要以下内容:

  1. 创建一个描述覆盖视图控制器的协议。
  2. 使用协议扩展将呈现/关闭视图控制器的逻辑封装到该协议中。
  3. 为覆盖主机创建协议。
  4. 使用协议扩展将覆盖视图控制器从故事板实例化到该协议中的逻辑封装。

你都准备好了。用法如下所示:

class ViewController: UIViewController, OverlayHost {
    @IBAction func showOverlayButtonPressed() {
        showOverlay(type: YourOverlayViewController.self, 
            fromStoryboardWithName: "Main")
    }
}

源代码:https ://github.com/agordeev/OverlayViewController

于 2017-04-22T07:46:37.517 回答