我认为这可能是您最好的解决方案。在 iOS 中,ViewController 占用了它所有的可用空间。如果没有您自己管理的“容器”视图,您放置的任何视图控制器都将占据整个窗口,覆盖您显示的任何内容。
但是,根据您的项目,还有一种可能更简单的替代方法。
您可以在某个中心位置(例如,您的 App Delegate 类)创建一个 UIView 对象(您的按钮)。该视图可能有一个附加到方法的按钮:
@implementation AppDelegate
- (void) someSetupMethod {
UIButton* b = [UIButton buttonWithType:UIButtonTypeCustom];
// setup whatever properties
// Now set button to call a method *on this AppDelegate object* ("self"):
[b addTarget:self action:@selector(homeButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
// Store the button definition somewhere permanant
self.reusableHomeButton = b;
}
- (void) homeButtonTapped:(id)sender {
// do something to pop view controllers back to what you want.
}
然后,在您的视图控制器中,它们都可以在出现时显示主页按钮:
- (void) viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
AppDelegate* appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
[self.view addSubview:appDelegate.reusableHomeButton];
}
这利用了一个有意的副作用,[view addSubview:...]
即如果视图已经在某个父视图中,它首先将其从该父视图中删除,然后添加到新视图中。
它还利用了按钮可以将其消息发送到任何对象的事实。它不必是承载按钮父视图的 ViewController。
这会导致您的按钮在出现新控制器时从一个显示的视图控制器的 .view 中“移动”到新的。
由于该按钮具有 AppDelegate 对象的目标(因此会将其消息发送到该对象),因此只要应用程序委托对象存在以接收消息,它就可以“从任何地方”工作(只要您的应用程序在跑)。