我对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)如果没有,还有其他方法可以做这样的事吗?
非常感谢你。 干杯
答案 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中这样做。 谢谢