在充当代表的视图之间创建共享工具栏

使用Xcode 9.1&Storyboards,我试图创建一个应用程序,根视图控制器包含后续内容的容器视图,以及我想要在所有正在加载的内容之间共享的几个按钮。 我正在寻找来自任何试图在我的方法上做类似的事情的人的建议。

第一个视图的容器视图加载一个导航控制器,以处理视图堆栈和细节。

这是基本的布局:

Xcode Storyboard中的基本布局

我正在考虑像这样使用Container View,因为它有点像导航控制器在每个视图上显示其工具栏,但不必为每个视图重新创建每个按钮。

我的意图是让每个子视图(当可见时)成为父按钮栏的代表,这样,无论何时选择了Exit或Prev / Next(</>)按钮,他们都会得到通知并可以采取相应的行动。 根视图控制器不会负责将每个视图加载到导航控制器中,并且按钮的行为(特别是下一步按钮)将取决于当前加载的视图。

为此,我在根视图控制器.h中创建了一个协议,使用SO上别处找到的答案:

@protocol RootViewControllerToolbarDelegate;

并定义了界面:

@protocol RootViewControllerToolbarDelegate <NSObject>
@optional

- (void)rootViewController:(RootViewController*)viewController
             didChooseButton:(ToolbarButtonType)toolbarButtonType;

ToolbarButtonType是一个简单的枚举。 在根(父)的相应.m文件中,我为这些按钮设置了一个IBAction,并在此范围内通知任何已注册的代表:

id<RootViewControllerToolbarDelegate> strongDelegate = self.delegate;
if ([strongDelegate respondsToSelector:@selector(rootViewController:didChooseButton:)]) {

[strongDelegate rootViewController:self didChooseButton:([sender tag] == 1 ? ToolbarButtonPrevious : ToolbarButtonNext)];

}

在随后的视图中 - 加载到导航控制器(位于根视图控制器的容器视图内) - 我已经设置了一个测试,以便.h实现我在根中创建的委托,将自我指派给委托viewDidLoad中:

RootViewController *rvc = (RootViewController *)[UIApplication sharedApplication].keyWindow.rootViewController;
rvc.delegate = self;

然后定义委托方法来处理该操作。

- (void)rootViewController:(RootViewController*)viewController
       didChooseButton:(ToolbarButtonType)toolbarButtonType{
    switch (toolbarButtonType){
        case ToolbarButtonNext: { //test
            MyNextViewToLoad *emv = [self.storyboard instantiateViewControllerWithIdentifier:@"sbIdMyNextView"];
            [self.navigationController pushViewController:emv animated:YES];
            break;
        }
        default: break;
    }
}

至少在这个简单的测试中,这一切都起作用,但我有问题:

  • 即使这样做,我已经编写了足够长的编码,让我觉得自己正走错了方向,而且我想知道是否有更好的方法来执行我的任务?
  • 我没有去通知,因为我不希望多个视图响应同一个消息,并且必须确定哪个视图应该响应(加上事件系统可能变得难以管理),但是所有这些都是更好的方法吗? 例如,也许只是在继续观看下一个视图之前取消注册每个视图的观察者是我需要做的事情?
  • 如前所述,我没有使用导航控制器工具栏,因为AFAIK意味着将工具栏按钮添加到每个视图中。 它似乎也有一些工具栏的布局限制,例如定义高度或删除边框的任何痕迹。 这就是说,这是否是正确的方法(并使每个子视图都是viewController工具栏的代表)?
  • 有没有从上面的代码,特别是内存(我使用ARC)的监视?
  • 非常感谢您的建议。

    链接地址: http://www.djcxy.com/p/52411.html

    上一篇: Creating a shared toolbar across views that act as delegates

    下一篇: State Preservation for View Controllers with Custom Delegates or Data Sources