UIButton类解除视图控制器

时间:2014-05-07 09:50:40

标签: ios objective-c uibutton

我对ObjectiveC相当新(+/-两周),所以我很难实现其他语言中易于使用的东西,我希望有人可以提供帮助(如果可能的话) ):

背景: 我在一个相当复杂的架构中有许多窗口的接口,每个窗口可以调用其他窗口(ViewControllers,TableViewControllers,Tab / Nav VC等)。 我正在使用" Modal"现在,因为我无法计算如何使用Push而不会出错。 每个窗口都有一个调用dismissViewController的按钮,这个按钮在任何地方都是相同的(相同的图形,位置等)。

我觉得为每个人创建一个IBAction是混乱的,给出完全相同的名称和相同的功能,所以我决定创建一个" Custom Class" UIButton类别,将所有参数放在那里,只需将故事板中的按钮设为一个类,这样就可以毫不费力地配置它们。

问题: 虽然这对于一些具有复杂功能的按钮非常有效,但它并不适用于dismissViewController ...我想它是因为我正在使用" self",这在这里是错误的,但是我不知道如何使用"父母"? 这是代码

#import "returnToMainMenuButton.h"

@implementation returnToMainMenuButton

-(IBAction)returnToMainMenu:(id)sender
{
    [self dismissViewControllerAnimated:YES completion:nil];

}
@end

问题: 1)可以这样做吗?由于我不想在我的代码中重复完全相同的步骤10次,我宁愿一次调用该操作而不是声明并启动它。 (我想有可能我们可以选择预定义类型,例如"添加","保存"等等)

2)如果是,您能否告诉我如何或这样做的教程?

3)如果没有,还有其他方法可以做这样的事吗?

非常感谢你。 干杯

3 个答案:

答案 0 :(得分:1)

这里的主要问题是UIButton知道没有名为dismissViewControllerAnimated:completion:的方法。这是UIViewController方法。

此外,没有办法从UIView(或子类,您的类是其子类的子类)开始并进入其视图控制器。 UIViewController可以访问其所有视图和子视图。但是无法保证您的UIButton在视图层次结构中的嵌套程度如何,我们必须在每个视图中进行递归并找到与您的按钮类匹配的视图。

我能想到的唯一真正的选择是创建一个UIViewController子类,其方法如下:

- (IBAction)exit:(id)sender {
    if (self.navigationController) {
        [self.navigationController popViewControllerAnimated:YES];
    } else {
        [self dismissViewControllerAnimated:YES completion:nil];
    }
}

所以现在这个代码将摆脱视图控制器,无论它是否在导航控制器中(作为注释,if检查可能不够好 - 可能需要更多条件)。

现在,使所有视图控制器成为此视图控制器的子类。并将常规的非子类UIButtons挂钩到一个看起来像这样的方法:

- (IBAction)exit:(id)sender {
    [super exit:sender];
}

如果您在按下按钮时需要执行任何其他代码,则可以将其置于super的呼叫周围。您仍然需要将按钮连接到每个视图控制器...除非您想要为每个按钮提供它需要关闭的视图控制器的引用。但这种方式不那么混乱,也更容易维护。视图控制器需要负责何时被解雇或即将呈现新的视图控制器。更改视图控制器的逻辑不应该在视图控制器类之外。

答案 1 :(得分:0)

对于这个东西,在按钮的动作中你可以获得当前视图控制器的父视图控制器,现在如果它是UINavigationViewController,那么你可以弹出视图,否则你可以忽略它。

答案 2 :(得分:0)

所以,我实际上解决了一半以上的问题,而我仍然无法找到确切的父(或当前视图),我可以快速进行设置,这节省了我很多时间。

基本上,在UIButton类(ButtonClass.m)中,我在" initWithFrame"中启动按钮。如下:     

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        // Styling goes here, such as title, image, and position/alignment
        // Adding an IB Action as follow:
        [self addTarget:self action:@selector(theAction:) forControlEvents:UIControlEventTouchUpInside];
        [self.window.rootViewController dismissViewControllerAnimated:YES completion:nil];    
    }
    return self;
}

该操作,在同一个文件中:

-(IBAction)theAction:(id)sender
{
    //This works, but returns me to the root view
    [self.window.rootViewController dismissViewControllerAnimated:YES completion:nil];
    //This works really weirdly and is inconsistent [self.window.rootViewController.parentViewController dismissViewControllerAnimated:YES completion:nil];
}

从这里开始,无需在任何视图中使用Storyboard ,我需要按钮,只需执行此操作:

#import "ButtonClass.h"

然后

UIButton *button = [[ButtonClass alloc] init];
[self.view addSubview:button];

我希望这可以帮助任何人通过将操作/样式绑定到按钮来减少工作量(任何与当前视图无关的操作都可以工作,例如访问Core Data或Multipeer Connectivity等)。

如果在创建时传递当前视图自我到按钮,我很高兴知道它。我知道它应该是可能的,但不是如何在Objective-C中这样做。 谢谢