【问题标题】:iPhone: Switching Views From Outside Root ControlleriPhone:从外部根控制器切换视图
【发布时间】:2010-04-22 16:10:30
【问题描述】:

我正在使用 UINavigationController 在视图之间切换。我希望每个视图能够通过在视图中设置按钮来控制何时将其换出另一个视图。到目前为止,我看到的所有示例都在工具栏上放置了按钮,该工具栏位于包含 Switch View Controller 而不是视图的根视图上,它们本身。有可能做我想做的事吗?我不知道如何将连接重新连接到 UINavigationController。

我很难措辞,所以如果您需要进一步说明,请随时告诉我。

【问题讨论】:

    标签: iphone objective-c cocoa-touch


    【解决方案1】:

    了解委托。委托是一种常用的方法,可以将对象的内容发送给它们的“父对象”或任何其他对象。

    您的子视图应该有一个“委托”属性(实际上可以称为任何东西,这只是一个约定)。您可以在子视图中添加按钮。

    您像这样声明委托:

    interface ChildView : UIViewController {
        id delegate;
    }
    
    @property (assign) id delegate;
    
    implementation ChildView
    
    @synthesize delegate;
    

    然后,当您在 UINavigationController 中设置子视图时,您可以:

    ChildView *childView = [[ChildView alloc] init...]
    childView.delegate = self;
    

    在您的子视图中,您有一个按钮方法:

    - (IBAction) didPressButton:(id)sender {
        [self.delegate didPressButtonToSwapView];
    }
    

    在你的 UINavigationController 中,你有一个方法:

    - (void) didPressButtonToSwapView {
        [self popViewController]; // use the right names, I made these up :)
        [self pushAnotherViewController];
    }
    

    您还应该阅读protocols,这将使上述代码更加健壮,并帮助您确保只在委托上调用正确的方法,但我不想让这个示例复杂化。

    编辑:是的,摆脱警告的最干净的方法是使用协议。只需将其放在单独的 .h 文件中即可:

    @protocol SwitchingDelegate
    - (void) didPressButtonToSwapView;
    @end
    

    在 UINavController 标头中包含这个 .h,并说 UINavController 实现了协议:

    @interface MyNav: UINavController <SwitchingDelegate> { ...
    

    在实现中实现该方法(您不需要在接口中添加任何内容)。

    在您的 ChildView 中,说委托必须实现协议:将所有声明更改为:

    id<SwitchingDelegate> delegate;
    

    然后编译器通过检查委托对象是否真正实现协议来帮助您。正确完成所有这些操作后,您应该不会收到任何警告。

    【讨论】:

    • 感谢您的回复。我绝对认为这是在正确的轨道上,但我在 [self.delegate didPressButtonToSwapView] 上收到警告,因为找不到该方法。我的视图是否需要实现与 UINavigationController 相同的协议?再次感谢...
    • 还有其他方法可以消除警告,但最干净的是做一个协议。我添加了一些关于你将如何执行协议的信息。
    • 这很完美。非常感谢您的帮助。我学到了一些关于协议的新东西。它们与我习惯的 C# 接口略有不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2012-04-26
    • 2018-04-22
    • 1970-01-01
    相关资源
    最近更新 更多