如何在模态视图的工具栏上添加标题和完成按钮

Posted

技术标签:

【中文标题】如何在模态视图的工具栏上添加标题和完成按钮【英文标题】:How to add title and Done button on toolbar in a modal view 【发布时间】:2011-09-26 16:36:06 【问题描述】:

我尝试从导航视图控制器 (DateViewController) 呈现模式视图 (InfoViewController)。

我在 InfoViewContoller 的视图顶部添加了一个工具栏。现在我想在工具栏上添加一个标题“信息”和一个“完成”按钮。(完成按钮将执行 infoDismissAction 方法)

谁能给我一些建议?非常感谢!

这里是 DateViewController.h 的代码

#import <UIKit/UIKit.h>
#import "InfoViewController.h"
@interface DateViewController : UIViewController 

    InfoViewController *infoViewController;

@property (nonatomic, retain) InfoViewController *infoViewController;
@end

DateViewController.m

- (IBAction)modalViewAction:(id)sender    
    if (self.infoViewController == nil)
        self.infoViewController = [[[InfoViewController alloc] initWithNibName:
                                   NSStringFromClass([InfoViewController class]) bundle:nil] autorelease];
    [self presentModalViewController:self.infoViewController animated:YES];


- (void)dealloc
    if (self.infoViewController != nil)
    
        [infoViewController release];
    
    [super dealloc];


- (void)viewDidLoad
    self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Info"  style:UIBarButtonSystemItemPlay target:self  action:@selector(modalViewAction:)] autorelease];
    [modalBarButtonItem release];
    [super viewDidLoad];

这里是 InfoViewController.m

- (IBAction)infoDismissAction:(id)sender
    [self.parentViewController dismissModalViewControllerAnimated:YES];


- (void)viewDidLoad 
    UIToolbar *toolBar;
    toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 50)];
    toolBar.frame = CGRectMake(0, 0, 320, 50);
    toolBar.barStyle = UIBarStyleDefault;
    [toolBar sizeToFit];        
    [self.view addSubview:toolBar]; 
    [toolBar release];
    [backButton release];
    [super viewDidLoad];

【问题讨论】:

【参考方案1】:

试试这个代码。

- (void)viewDidLoad 
       UIToolbar *toolBar;
            toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 50)];
            toolBar.frame = CGRectMake(0, 0, 320, 50);
            toolBar.barStyle = UIBarStyleDefault;
            [toolBar sizeToFit];      
UIBarButtonItem *flexibleSpace = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil] autorelease];
UIBarButtonItem *infoButton = [[[UIBarButtonItem alloc] initWithTitle:@"INFO" style:UIBarButtonItemStyleBordered target:self action:@selector(InfoAction:)] autorelease];
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"DONE" style:UIBarButtonItemStyleBordered target:self action:@selector(doneAction:)];


            NSArray *barButton  =   [[NSArray alloc] initWithObjects:flexibleSpace,infoButton,flexibleSpace,doneButton,nil];
            [toolBar setItems:barButton];

        [self.view addSubview:toolBar];
        [toolBar release];
        [barButton release];
        barButton = nil;
        [super viewDidLoad];


【讨论】:

谢谢!现在我知道如何使用flexibleSpace了。但我的意思是如何添加“信息”标题而不是“信息”栏按钮。【参考方案2】:

我建议使用您的 InfoViewController 设置另一个 UINavigationController 并将导航控制器呈现为您的模态视图。

要回答您的问题,您需要像这样填写您的 UIToolbar:

- (void)viewDidLoad 
  [super viewDidLoad];
  UIToolbar *toolBar;
  toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 50)];
  toolBar.frame = CGRectMake(0, 0, 320, 50);
  toolBar.barStyle = UIBarStyleDefault;
  [toolBar sizeToFit];        
  [self.view addSubview:toolBar]; 
  [toolBar release];

  UIBarButtonItem* bbiInfo = [[UIBarButtonItem alloc] initWithTitle:@"Info" style:UIBarButtonItemStyleBordered target:self action:@selector(tappedInfoButton)];
  UIBarButtonItem* flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
  UIBarButtonItem* bbiDone = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(tappedDoneButton)];
  NSArray* items = [[NSArray alloc] initWithObjects:bbiInfo, flexibleSpace, bbiDone, nil];
  [toolBar setItems:items];

  [items release];
  [bbiInfo release];
  [flexibleSpace release];
  [bbiDone release];

【讨论】:

谢谢!现在我知道如何使用flexibleSpace了。但我的意思是如何添加“信息”标题而不是“信息”栏按钮。 UIBarButtonItem* infoTitle = [[UIBarButtonItem alloc] initWithTitle:@"Info" style:UIBarButtonItemStylePlain target:self action:nil]; 谢谢:P 但是有什么办法可以把 infoTitle 放在 toolBar 的中心呢?我尝试了以下代码,但无法将 infoLabel 置于中心位置。 NSArray* items = [[NSArray alloc] initWithObjects:flexibleSpace,infoLabel, flexibleSpace, bbiDone, nil]; [工具栏 setItems:items]; 这是我尽量避免使用 UIToolbar 的原因之一。 UINavigationBar 为您处理。如果您坚持使用 UIToolbar,我建议您使用 UIBarButtonSystemItemFixedSpace 并根据自己的喜好调整其宽度。 我的同事@slaunchman 更喜欢这种方法,其原因将在未来变得清晰。

以上是关于如何在模态视图的工具栏上添加标题和完成按钮的主要内容,如果未能解决你的问题,请参考以下文章

在表格中的视图按钮上添加模态

栏按钮项以编程方式添加工具栏

将模态视图放在视图上并使背景变灰

Swift - UIPickerView 子视图中没有出现工具栏完成按钮

视图加载后是不是可以在工具栏上添加、删除或隐藏按钮?

Swift 自定义工具栏实现