【问题标题】:iPhone - Dismiss modal view by a UITabBarControlleriPhone - 通过 UITabBarController 关闭模式视图
【发布时间】:2010-04-26 22:44:42
【问题描述】:

我遇到了一个非常奇怪的问题。我创建了自己的 UITabBarController 来自定义它,它工作得很好……除了模态视图。当我用动画关闭模态视图(从 UITabBarController 呈现/关闭)时,它会等到动画完成并转到选项卡栏的第一个控制器!

为什么控制器会改变?我该如何解决?

谢谢

PS:我的 UITabBarController 视图在主窗口上,上面有一个 UITabBar。控制器(由标签栏管理)位于标签栏控制器视图上方的主窗口上,高度较短。当我呈现模态视图时,我将标签栏控制器视图置于前面。

【问题讨论】:

    标签: iphone objective-c dismiss modal-view


    【解决方案1】:

    在阅读了您对我的第一个答案的评论后,我更好地理解了您在做什么,尽管如果不看代码就很难弄清楚出了什么问题。我使用自定义选项卡栏控制器(从UIViewController 子类化)创建了另一个项目,其中一个选项卡式视图有一个显示模式视图控制器的按钮。当我关闭模式视图时,它会返回到我所在的选项卡。

    在您的问题中,您说由选项卡栏管理的视图控制器位于主窗口上,并且当您呈现模态视图时,您将选项卡栏控制器视图置于前面。这对我来说没有意义。

    对于我的示例,我将CustomTabBarController 设为UIViewController 的子类,并为带有两个标签栏项目和两个视图控制器的标签栏创建实例变量。我添加了标签栏和成员视图控制器的两个视图作为CustomTabBarController 视图的子视图(我设置了视图控制器视图的框架,因此它们不会与标签栏重叠)。我还将CustomTabBarController 设置为标签栏的代表。当一个标签栏项目被选中时,我将消息bringSubviewToFront: 发送到CustomTabBarController 的视图,并将适当的子视图作为参数。

    其中一个成员视图控制器视图有一个按钮,当点击该按钮时,会显示模态视图。当点击按钮时,视图控制器可以调用presentModalViewController:,但是,既然你说你的标签栏控制器正在这样做,我在视图控制器中有一个 IBAction 方法(这是呈现模式视图的按钮的目标)调用CustomTabBarController 中的一个方法,该方法调用presentModalViewController:。视图控制器有一个CustomTabBarController 的ivar(因为视图控制器属于CustomTabBarController,这很容易设置)。

    模态视图控制器类也有一个用于CustomTabBarController 的ivar(我在调用presentModalViewController: 之前设置了它),并且我在模态视图中有一个按钮可以关闭模​​态视图。该按钮连接到模态视图控制器类中的 IBAction,然后调用 CustomTabBarController 中的方法。

    当我这样做时,一切都按预期工作。我确定您有创建自定义标签栏控制器的理由,但我怀疑它是否真的有必要。我希望这会有所帮助。

    【讨论】:

    • 嘿,首先非常感谢您抽出宝贵时间回答...我真的很感激!我想要一个自定义的 tabBar,因为我想以一种特定的方式管理标签栏。我希望它(有时)没有选择任何内容,因为标签栏管理超过 5 个控制器。我也想改变标签栏的高度......无论如何,我真的需要那个!我有时还需要导航栏,有时不需要导航栏,我必须将控制器放在窗口上,而不是放在自定义的标签栏控制器(视图)上。我可以发给你,但不能在这里写...
    • 我没有在标签栏上选择任何内容。如果显示标签栏,应该选择一个标签,不是吗?否则,显示的是什么视图以及该视图与标签栏的关系如何?当您说有时有导航栏而有时没有时,这具体是什么意思?这是否意味着在某些选项卡视图中您将有一个导航栏而有些则没有?你真的确定你的设计是正确的。听起来您的设计很尴尬,可以/应该以不同的方式完成。当然不确定,但它就是这样出现的。
    • 我知道...这看起来很尴尬,但事实并非如此!我想优化我的视图,所以当不需要某些东西时我会隐藏它。 1)当我点击一个单元格时,我有一个表格视图(在我的一个 tabBar 控制器中)我得到一个带有导航栏的新控制器......在我的表格视图中隐藏导航栏是否有意义?对我来说确实如此! 2)我有一个带有图标的主菜单(如在 iPhone OS 上)。当我点击其中一个图标时,我会使用标签栏进入控制器,但有时菜单不是很重要,因此它不会出现在标签栏上(使用标签栏,用户始终可以访问重要菜单)感觉?
    • 别误会,我不是在谈论 GUI 设计或应用程序的功能,而是软件设计/架构。就您的原始问题和应用程序的复杂性而言,这可能就是答案所在。
    • 你是对的......但是除了模态视图之外一切都正常......所以我仍然有希望!
    【解决方案2】:

    我有一些问题:

    1) 当您说“创建了我自己的 UITabBarController”时,您的意思是您继承了 UITabBarController 的子类吗?

    2) 如何调用呈现模态视图控制器?是否有一个按钮或正在被点击的东西来调用呈现模态视图控制器?

    您说控制器“位于主窗口上”,并且当您呈现模态视图时,您“将标签栏控制器视图置于前面”。这让我很困惑。视图控制器应该“属于”标签栏控制器。

    我创建了一个小项目并让它为我工作,所以这就是我所做的:

    1) 我创建了一个 UITabBarController 的子类:

    @interface MyTabBarController : UITabBarController
    {
    }
    
    - (IBAction)presentModalView:(id)sender;
    - (void)dismissModalview;
    
    @end
    
    
    @implementation MyTabBarController
    
    - (IBAction)presentModalView:(id)sender
    {
        MyModalViewController* myModalView = [[MyModalViewController alloc] initWithNibName:@"ModalView" bundle:nil];
        [myModalView setTbc:self];
        [self presentModalViewController:myModalView animated:YES];
    }
    
    - (void)dismissModalview;
    {
        [self dismissModalViewControllerAnimated:YES];
    }
    @end
    

    2) 然后为我的模态视图控制器创建了 UIViewController 的子类:

    @interface MyModalViewController : UIViewController
    {
        MyTabBarController* tbc;
    }
    
    @property (retain) MyTabBarController* tbc;
    
    - (IBAction)returnToTabBar:(id)sender;
    
    @end
    
    
    @implementation MyModalViewController
    
    @synthesize tbc;
    
    - (IBAction)returnToTabBar:(id)sender;
    {
        [tbc dismissModalview];
    }
    
    @end
    

    3) 我将一个标签栏控制器拖入 MainWindow.xib,将其文件所有者设置为 MyTabBarController,并将视图控制器添加到两个标签(我使用检查器将每个标签的背景颜色设置为不同的颜色)。在第二个选项卡的视图控制器中,我添加了一个按钮并将其目标设置为 MyTabBarController 中的操作“presentModalView:”。

    4) 我创建了一个新的 xib,其中包含一个名为 ModalView 的视图,并将其 File's Owner 设置为 MyModalViewController。我将视图的背景颜色设置为与上述两种颜色不同的颜色,并在视图中添加了一个按钮。我将按钮的目标设置为 MyModalviewController 中的操作“returnToTabBar:”。

    显然,我必须将标签栏视图添加到应用程序委托中窗口的子视图中。这对我有用,并在我在第二个选项卡上时呈现了一个模态视图控制器,当我关闭它时,我返回到选项卡栏控制器中的第二个选项卡。

    我希望这会有所帮助!

    【讨论】:

    • 所以...回答您的问题:1. 不,它是 UIViewController 的子类,2:是的,它是其中一个视图上的按钮 我所做的是将 customUITabBarController 放在主窗口上,然后我的托管(由 customUITabBarController)视图控制器也是......在我的 customUITabBarController 的视图中,我有 UITabBar。希望清楚!我不知道如何更好地解释
    【解决方案3】:

    我怀疑您在 viewDidLoad 中做了很多(太多?)初始化工作,其中之一是选择第一个选项卡?

    也许您可以与我们分享您的自定义标签栏控制器类中的初始化/加载顺序?

    您的标签栏控制器视图可能会在显示模式视图时卸载,并在模式关闭时重新加载(调用viewDidLoad)。

    我的建议是在选项卡切换和视图加载方法处设置一些调试器断点,并检查调用堆栈以确保您的选项卡栏控制器的生命周期符合您的理解。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-01
      • 2012-07-04
      • 1970-01-01
      • 1970-01-01
      • 2014-11-25
      • 2011-10-10
      • 2012-01-20
      相关资源
      最近更新 更多