以编程方式将项目添加到 UIToolbar 不起作用

Posted

技术标签:

【中文标题】以编程方式将项目添加到 UIToolbar 不起作用【英文标题】:Adding Items to UIToolbar Programmatically Not Working 【发布时间】:2010-12-18 02:58:40 【问题描述】:

我最近一直在问有关 UIToolbars 和其他问题的问题,但现在我发现我需要以编程方式向其中添加项目,我已经看到其他人关于如何去做的方法,但是当我尝试做同样的事情时事情,什么都没有出现。查明这个问题是我需要帮助的。以下是我在 IB 的人脉:

这里是相关代码:

头文件:

#import <UIKit/UIKit.h>

@interface ParkingRootViewController : UIViewController 
    UINavigationController *navigationController;
    UIToolbar *toolbar;
    UIBarButtonItem *lastUpdateLabel;


@property(nonatomic, retain) IBOutlet UINavigationController *navigationController;
@property (nonatomic, retain) IBOutlet UIToolbar *toolbar;
@property (nonatomic, retain) IBOutlet UIBarButtonItem *lastUpdateLabel;

- (IBAction)selectHome:(id)sender;

@end

实现文件:

- (void)viewDidLoad 
        [super viewDidLoad];

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 150.0f, 20.0f)];
    label.text = @"last updated...";
    label.textColor = [UIColor colorWithWhite:1.0 alpha:1.0];
    label.backgroundColor = [UIColor clearColor];
    label.textAlignment = UITextAlignmentCenter;
    label.font = [UIFont boldSystemFontOfSize:13.0];
    label.userInteractionEnabled = NO;

    lastUpdateLabel = [[UIBarButtonItem alloc] initWithCustomView:label];
    [label release];
    [toolbar setItems:[NSArray arrayWithObject:lastUpdateLabel]];


    [self.view addSubview:self.navigationController.view];
    //[self.view addSubview:toolbar];
    //[self.navigationController.view addSubview:toolbar];

    [self.navigationController.view setFrame:self.view.frame];


非常感谢任何帮助!

编辑:

我删除了笔尖中会导致工具栏出现/被修改的所有内容,并将 viewDidLoad 中的代码更新为以下内容:

    self.navigationController.toolbarHidden = NO;

    //creating label in tool bar 
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 150.0f, 20.0f)];
    label.text = @"last updated...";
    label.textColor = [UIColor colorWithWhite:1.0 alpha:1.0];
    label.backgroundColor = [UIColor clearColor];
    label.textAlignment = UITextAlignmentCenter;
    //label.highlightedTextColor = [UIColor colorWithWhite:0.5 alpha:1.0];
    //label.highlighted = YES;
    label.font = [UIFont systemFontOfSize:13.0];
    label.userInteractionEnabled = NO;

    UIBarButtonItem *lastUpdateLabel = [[UIBarButtonItem alloc] initWithCustomView:label];
    //[lastUpdateLabel initWithCustomView:label];
    //[label release];
    //[toolbar setItems:[NSArray arrayWithObject:lastUpdateLabel]];
    [self setToolbarItems:[NSArray arrayWithObject:lastUpdateLabel]];

我最终会出现一个空白工具栏。我启动了调试器,这就是我所看到的: 啊哈! lastUpdateLabel 视图的 _text 字段超出范围!但为什么?我将如何解决这个问题?

编辑 2:

我已经能够使用以下代码添加标签和 NSActivityIndi​​cator:

@synthesize refreshDataButton;
//...
self.navigationController.toolbarHidden = NO;

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(20.0f, 0.0f, 80.0f, 40.0f)];
    label.text = @"last updated...";
    label.textColor = [UIColor colorWithWhite:1.0 alpha:1.0];
    label.backgroundColor = [UIColor clearColor];
    label.textAlignment = UITextAlignmentCenter;
    label.font = [UIFont systemFontOfSize:13.0];
    label.userInteractionEnabled = NO;
    [self.toolbar addSubview:label];

// create activity indicator
    //                        dist frm lft, dist frm top
    CGRect frame = CGRectMake(   90.0,         11.0,      25.0, 25.0);      
    UIActivityIndicatorView *loading = [[UIActivityIndicatorView alloc] initWithFrame:frame];   
    loading.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite; 
    [loading sizeToFit];    
    loading.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin | 
                                UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | 
                                UIViewAutoresizingFlexibleBottomMargin);    
    [loading startAnimating];

    [self.toolbar addSubview:loading];

但是当我尝试添加 UIBarButtonItem 时,我没有运气(没有显示在工具栏中):

self.refreshDataButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:100 target:self action:@selector(refreshDataButtonTapped)];
[self setToolbarItems:[NSArray arrayWithObject:refreshDataButton]];

这是头文件:

 #import <UIKit/UIKit.h>
//#import <CoreData/CoreData.h>

@interface ParkingRootViewController : UIViewController 
    UINavigationController *navigationController;
    UIToolbar *toolbar;
    UIBarButtonItem *refreshDataButton;
    //UIActivityIndicatorView *loading;


@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;
@property (nonatomic, retain) IBOutlet UIToolbar *toolbar;
@property (nonatomic, retain) UIBarButtonItem *refreshDataButton;
//@property (nonatomic, retain) IBOutlet UIActivityIndicatorView *loading;


@property (nonatomic, readonly) NSString *applicationDocumentsDirectory;

-(IBAction)selectHome:(id)sender;
-(void)testCoreData;
-(void)refreshDataButtonTapped;

@end

【问题讨论】:

【参考方案1】:

代码应该可以工作...我可以提出一些建议。而不是:

[toolbar setItems:[NSArray arrayWithObject:lastUpdateLabel]];

试试这个:

[toolbar setItems:[NSArray arrayWithObject:lastUpdateLabel] animated:YES];

此外,由于您使用的是 UINavigationController,因此 NavController 带有自己的工具栏,您可以根据需要使用它们。默认情况下它是隐藏的,您可以通过以下操作使其可见:

self.navigationController.toolbarHidden = NO;

你可以通过这样做来设置它的工具栏项:

[self setToolbarItems:[NSArray arrayWithObject:lastUpdateLabel]];

希望这个花絮对你有所帮助。祝你好运!

【讨论】:

谢谢,我找到了 self.navigationController.toolbarHidden = NO;对我有用/工作。但是我仍然遇到空白工具栏。请参阅上面我对问题所做的修改。 您似乎在使用两个不同的工具栏。如果你想使用导航工具栏,你必须使用“self.navigationController.toolbar”来提及它。如果您使用自己的工具栏,那么您可以提及使用“self.toolbar”,如果它被设置为属性。您的子视图似乎已添加到您自己的工具栏,但正在为导航工具栏设置项目。这就是我要开始寻找问题的地方。【参考方案2】:

按钮需要由viewController添加,由navigationController推送。 navController 持有栏,但栏上的项目由正在显示的viewController 控制(添加)。这样,每种不同类型的 vc 都有自己的吧。

因此,将 barbuttonitem 代码放入 vc 的 init 部分,然后享受吧。

【讨论】:

【参考方案3】:

//试试这个。

- (void)viewDidAppear:(BOOL)animated

    [toolbar setItems:[NSArray arrayWithObject:lastUpdateLabel]];

【讨论】:

【参考方案4】:

发布的代码运行良好,我认为它必须是 XIB 的连接方式。我会在 IB 中重新建立您的连接(即断开所有连接并重新建立它们),保存您的 XIB 并重试。

【讨论】:

按照你的建议做了,没有运气。我只看到一个纯灰色的工具栏。抛出这行代码:toolbar.barStyle = UIBarStyleBlackOpaque;实际上让工具栏变黑,所以连接没有搞砸或任何东西......不过感谢您的回复。【参考方案5】:

如果你已经用框架实例化它,你可以直接将标签添加到工具栏...例如

   UILabel *lbl=[[UILabel alloc]initWithFrame:CGRectMake(7,7,200,30)];

   [lbl setBackgroundColor:[UIColor clearColor]];

   [lbl setText:@"Test lbl"];

   [_toolBar addSubview:lbl];

【讨论】:

以上是关于以编程方式将项目添加到 UIToolbar 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式创建 UIToolbar

Mootools:如何将点击功能绑定到以编程方式生成的元素

如何将 UILabel 添加到 UIToolbar?

以编程方式将 UILabel 添加到工具栏

UIToolbar外观用于以编程方式添加工具栏

以编程方式在 UINavigationBar 下方的 UIToolbar 中添加 UISegmentedControl