1

我正在尝试在我的应用程序中使用 NavigationController 的工具栏。这个工具栏的toolbarItems 应该根据显示的视图控制器而改变。这是非常基本的。

我要做的是使用 UIBarButtonItem 的“initWithCustomView:”方法将自定义按钮添加到工具栏。但是,该按钮不会显示在工具栏上。但是,如果我使用“initWithTitle:”或“initWithBarButtonSystemItem:”方法创建 UIBarButtonItem,按钮就会显示出来。例如,看下面的代码:

UIBarButtonItem *item1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemBookmarks target:self action:nil];
UIBarButtonItem *item2 = [[UIBarButtonItem alloc] initWithTitle:@"edit" style:UIBarButtonItemStylePlain target:self action:nil];

NSArray *array = [[NSArray alloc] initWithObjects:item1, item2, nil];
[self setToolbarItems:array];

如果这样做了,按钮就会出现在工具栏上。但是,如果我要执行以下操作:

UIButton* replyBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[replyBtn setImage:[UIImage imageNamed:@"Reply_Message.png"] forState:UIControlStateNormal];
[replyBtn addTarget:self action:@selector(replyButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
replyBtn.frame = CGRectMake(10, 0, 40, 40);
UIBarButtonItem *replyButton = [[UIBarButtonItem alloc] initWithCustomView:replyBtn];

UIBarButtonItem *item1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemBookmarks target:self action:nil];
UIBarButtonItem *item2 = [[UIBarButtonItem alloc] initWithTitle:@"edit" style:UIBarButtonItemStylePlain target:self action:nil];

NSArray *array = [[NSArray alloc] initWithObjects:item1, replyButton, item2, nil];
[self setToolbarItems:array];

在此代码中,只有 item1 和 item2 显示在工具栏上。replyButton 未显示在工具栏上。按钮所在的位置有空白区域。

如果在我创建的常规工具栏而不是 NavigationController 的工具栏上使用相同的代码,则会显示该按钮。我试图在整个应用程序中只使用一个工具栏来获得与 Apple 邮件应用程序相同的感觉。我需要使用“initWithCustomView:”方法的原因是因为其中一个图标是彩色的,这是它在普通工具栏上显示为彩色的唯一方式。现在,我查看了苹果文档,没有提到为什么不能调用“initWithCustomView:”方法(或者我找不到它)。

请有人对这个话题有所了解,以帮助我指出正确的方向。提前谢谢你们。

4

4 回答 4

1

我看不出与您尝试的不同,但它最终对我有用,使用该代码:

 //////////////////////////////////////////////////////////////////////////////////////////////
/////>>>> Adding buttons for browsing in the toolbar of the popover's navigation controller///
//////////////////////////////////////////////////////////////////////////////////////////////

//>>>>Create a goBack button    
goBack = [UIButton buttonWithType:UIButtonTypeCustom];
UIImage *goBackImage = [UIImage imageNamed:@"back1.png"];
[goBack setImage:goBackImage forState:UIControlStateNormal];
[goBack addTarget:self action:@selector(goBackClicked:) forControlEvents:UIControlEventTouchUpInside];
goBack.frame = CGRectMake(0,0,goBackImage.size.width,goBackImage.size.height);
//Create a Bar button to hold this button
UIBarButtonItem *goBackBarButton = [[[UIBarButtonItem alloc] initWithCustomView:goBack] autorelease]; 

UIBarButtonItem *flex1 = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil] autorelease];
UIBarButtonItem *addButton = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRewind target:nil action:nil] autorelease];
NSArray *arrayOfButtons = [[[NSArray alloc] initWithObjects:goBackBarButton, flex1, addButton, nil] autorelease];
[self setToolbarItems:arrayOfButtons];

请注意与您的一些差异(也许这就是问题所在?我不确定):1.我的按钮不是在方法中本地分配的,而是在类中分配的(你知道,属性,合成等)2.你的

[replyBtn setImage:[UIImage imageNamed:@"Reply_Message.png"] forState:UIControlStateNormal];

我的看起来有点不同

[goBack setImage:goBackImage forState:UIControlStateNormal];

试试这些微小的改变,也许它会起作用:)

于 2011-03-30T07:37:25.837 回答
1

我遇到了同样的问题。事实证明,每次新视图被推入堆栈时,UINavigationController 的工具栏都会重置它的项目。我试图在 applicationDidFinish 函数中设置工具栏项,但它不起作用。一旦我在被推送到导航堆栈的 viewController 的 - (void) viewDidAppear 函数中设置了工具栏 itms,它就起作用了。

因此,如果您希望导航控制器在整个应用程序中保持相同的工具栏项,您必须在视图出现后推送到导航控制器的每个视图中设置工具栏项。

我希望这会有所帮助!

于 2012-08-01T21:04:52.367 回答
0

我敢打赌,该项目没有出现,因为它的视图中没有任何内容。您确定Reply_Message.png在您的项目中调用了图像吗?[UIImage imageNamed:@"Reply_Message.png"]可能是nil

于 2010-07-28T03:08:09.167 回答
0

您可以在整个应用程序中使用一个工具栏,而无需使用导航控制器工具栏。由于您的代码使用非导航控制器工具栏,这可能是完成您想要的最简单的方法。在您的应用程序委托中,尝试向窗口添加工具栏,如下所示。这样,它在整个应用程序中都是持久的。确保您考虑了一种方案,该方案可让您访问工具栏以添加/删除按钮,或从不同的视图控制器隐藏/显示它。

    - (BOOL)application:(UIApplication *)application 
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

    /////// frame sizes ////////
    // compensate for the status bar
    int statusBarHeight = 20;

    // toolbar
    int toolbarWidth   = window.frame.size.width;
    int toolbarHeight  = 30;  // I think standard size is 30
    int toolbarxOffset = 0;
    int toolbaryOffset = window.frame.size.height - tHeight;
    CGRect toolbarFrame = CGRectMake(toolbarxOffset,
                                     toolbaryOffset,
                                     toolbarWidth,
                                     toolbarHeight);

    /////// toolbar //////////////////////
    self.myPersistentToolbar = [[UIToolbar alloc] initWithFrame:toolbarFrame];
    [window addSubview:self.myPersistentToolbar];
}
于 2010-08-20T00:20:12.863 回答