使一个button在所有视图控制器中保持不变

我想在我的应用程序的右下angular有一个持久button。 在所有视图转换期间,button应保持静态。 我无法决定添加button的视图。 我知道这个button应该存储在AppDelegate中,但是我不知道将其他视图添加到除窗口之外是否合适。 将其添加到窗口的一个缺点是,当有一个应用程序在后台运行(即电话),添加的状态栏填充将按下窗口。 一般来说,将它添加到窗口似乎是一个hacky解决scheme – 任何想法?

是的,将它添加到UIWindow将是非常hacky和挑剔。

故事板

如果你正在使用Storyboard和iOS 5.0,你应该能够使用容器视图,并做这样的事情:

MAH按钮很高兴

下面是另一张显示第一个视图控制器的简单结构的图片:

在这里输入图像描述

左边的视图控制器有一个容器,然后是一个视图,该button位于其上方。 容器表示导航控制器(直接向右)应该出现在它自己内部,那个关系用=([])=>箭头表示(正式地称为embedded段 )。 最后,导航控制器将其根视图控制器定义到右侧的视图控制器。

总而言之,第一个视图控制器在容器视图中进行煎饼,顶部有button,所以里面的所有内容都必须将button放在顶部。

使用childViewControllers

又名。 “我讨厌故事板和小狗”模式

使用与Storyboard版本类似的结构,您可以使用其button创build基本视图控制器,然后在下面添加将成为应用程序新“根”的视图。

为了清楚FakeRootViewController ,让我们调用一个包含FakeRootViewControllerbutton的视图控制器,以及为了所有实际目的而将视图控制器作为应用程序的根: RootViewController 。 所有后续的视图控制器甚至不会知道上面有FakeRootViewController

FakeRootViewController.m

 // The "real" root #import "RootViewController.h" // Call once after the view has been set up (either through nib or coded). - (void)setupRootViewController { // Instantiate what will become the new root RootViewController *root = [[RootViewController alloc] <#initWith...#>]; // Create the Navigation Controller UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:root]; // Add its view beneath all ours (including the button we made) [self addChildViewController:nav]; [self.view insertSubview:nav.view atIndex:0]; [nav didMoveToParentViewController:self]; } 

AppDelegate.m

 #import "FakeRootViewController.h" - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; FakeRootViewController *fakeRoot = [[FakeRootViewController alloc] <#initWith...#>]; self.window.rootViewController = fakeRoot; [self.window makeKeyAndVisible]; return YES; } 

这样,你就可以将所有的好处都放在窗口上,而没有任何内疚感和“我真的应该成为程序员吗? 它造成的。

可能你可能有1个主要的“根”视图控制器,而你所有的其他视图控制器可以是子视图控制器,其视图是子视图。 然后他们将有他们的内容,并且button将在“根”视图控制器中。 但是,这看起来就像把它放在窗口里一样简单而又粗俗,可能不太方便。

我使用这个button:

 @interface UIPopUpButton : UIImageView <UIPopoverControllerDelegate, UIActionSheetDelegate> { UIPopoverController* popoverController; Class popoverClass; } - (id) initWithPoint: (CGPoint) point; - (void) touchesBegan: (NSSet*) touches withEvent: (UIEvent*) event; + (id) buttonAtPoint: (CGPoint) point; + (id) buttonAtOriginalPoint; + (void) unhighlight; + (void) bringButtonToFront; @property (nonatomic, retain) UIPopoverController* popoverController; @property (nonatomic, assign) Class popoverClass; @end #import "UIPopUpButton.h" @implementation UIPopUpButton static UIPopUpButton* button = nil; static CGPoint originalPoint; @synthesize popoverClass; @synthesize popoverController; + (id) buttonAtPoint: (CGPoint) point { if (button == nil) { button = [[UIPopUpButton alloc] initWithPoint: point]; originalPoint = point; button.popoverClass = [UIPopoverController class]; } else { button.frame = CGRectMake(point.x, point.y, button.frame.size.width, button.frame.size.height); } return button; } + (id) buttonAtOriginalPoint { return [self buttonAtPoint: originalPoint]; } + (void) unhighlight { button.highlighted = NO; } + (void) bringButtonToFront { [[UIApplication sharedApplication].keyWindow addSubview: [self buttonAtOriginalPoint]]; } - (id) initWithPoint: (CGPoint) point { UIImage* image1 = [UIImage imageNamed: @"topbutton.png"]; UIImage* image2 = [UIImage imageNamed: @"topbutton.png"]; if ((self = [super initWithImage: image1 highlightedImage: image2])) { self.userInteractionEnabled = YES; self.frame = CGRectMake(point.x, point.y, self.frame.size.width, self.frame.size.height); self.multipleTouchEnabled = NO; } return self; } - (BOOL) isAppCurrStatus { return ([DevToolsClientController sharedInstance].statusOfRootViewController == FrontEndApplication); } - (void) touchesBegan: (NSSet*) touches withEvent: (UIEvent*) event { UITouch* touch = [touches anyObject]; if(touch.view == self) { if (self.popoverController == nil) { if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { UIActionSheet* actionSheet = [[UIActionSheet alloc] initWithTitle: @"Please choice operation:" delegate: self cancelButtonTitle: nil destructiveButtonTitle: nil otherButtonTitles: nil]; [actionSheet addButtonWithTitle: @"Cancel"]; actionSheet.cancelButtonIndex = 0; [actionSheet addButtonWithTitle: @"Button 1"]; actionSheet.actionSheetStyle = UIActionSheetStyleDefault; [actionSheet setTag: 0]; [actionSheet setDelegate: self]; [actionSheet showInView: [self superview]]; [actionSheet release]; [actions release]; } else { PopoverMenuController* contentViewController = [[PopoverMenuController alloc] init]; self.popoverController = [[UIPopoverController alloc] initWithContentViewController: contentViewController]; popoverController.delegate = self; [popoverController presentPopoverFromRect: CGRectMake(10.0f, 10.0f, 5.0f, 5.0f) inView: self permittedArrowDirections: UIPopoverArrowDirectionAny animated: YES]; contentViewController.popoverController = self.popoverController; [contentViewController reloadData]; } } else { [self.popoverController dismissPopoverAnimated:YES]; self.popoverController = nil; } } [super touchesBegan: touches withEvent: event]; } #pragma mark UIActionSheetDelegate implementation -(void) actionSheet: (UIActionSheet*) actionSheet clickedButtonAtIndex: (NSInteger) buttonIndex { NSNumber* indexAction = [[NSNumber alloc] initWithInt: buttonIndex - 1]; } - (void) runAction: (NSNumber*) indexAction { [DevToolsPopoverMenuController runAction: [indexAction integerValue]]; } #pragma mark - #pragma mark UIPopoverControllerDelegate implementation - (void) popoverControllerDidDismissPopover: (UIPopoverController*) thePopoverController { if (self.popoverController != nil) { self.popoverController = nil; } } - (BOOL) popoverControllerShouldDismissPopover: (UIPopoverController*) thePopoverController { //The popover is automatically dismissed if you click outside it, unless you return NO here return YES; } @end 

呼叫:

  [UIPopUpButton bringButtonToFront]; 

我的button总是在最上面。

尝试inheritanceUIViewController类并使用button创build自己的类

创build一个持有button的单例对象,以便所有视图控制器都可以引用它并将其添加到其子视图中,或直接将其添加到窗口中。

 SomeClass.h @property (nonatomic) UIButton *yourButton; +(SomeClass*)sharedSomeClass; SomeClass.m @synthesize yourButton = _yourButton; -(id)init { self = [super init]; if(self) { _yourButton = [UIButton new]; //Other settings you want for your button } return self; } +(SomeClass)sharedSomeClass { static SomeClass *sharedSomeClass; if (!sharedSomeClass) sharedSomeClass = [[super allocWithZone:nil]init]; return sharedSomeClass; } +(void)allocWithZone:(NSZone*)zone { return [self sharedSomeClass]; } 

如果你喜欢,你可以像这样直接访问窗口:

 UIWindow *mainwindow = [[[UIApplication sharedApplication]delegate]window]; 

将SomeClass.h导入视图控制器,并从任何地方访问button

 #import "SomeClass.h" SomeClass *someClass = [SomeClass sharedSomeclass]; UIButton *localButton = someClass.yourButton;