我正在尝试在我的应用中使用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的Mail应用程序相同的感觉。我需要使用“initWithCustomView:”方法的原因是因为其中一个图标是彩色的,这是它在普通工具栏上显示彩色的唯一方式。现在,我已经查看了Apple文档,并且没有提到为什么无法调用“initWithCustomView:”方法(或者我找不到它)。
可以请有人对这个话题有所启发,以帮助我指出正确的方向。先谢谢你们。
答案 0 :(得分: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.我的按钮不是在方法中本地分配的,而是在类中(你知道,属性,合成等) 你的
[replyBtn setImage:[UIImage imageNamed:@"Reply_Message.png"] forState:UIControlStateNormal];
我的看起来有点不同
[goBack setImage:goBackImage forState:UIControlStateNormal];
尝试这些微小的变化,也许它会起作用:)
答案 1 :(得分:1)
我遇到了同样的问题。事实证明,每当新视图被推入堆栈时,UINavigationController的工具栏就会重置它的项目。我试图在applicationDidFinish函数中设置工具栏项,但它无法正常工作。一旦我将工具栏设置在正被推送到导航堆栈的viewController的 - (void)viewDidAppear函数中,它就可以工作了。
因此,似乎您希望导航控制器在整个应用程序中保留相同的工具栏项,您必须在视图出现后将每个视图中的工具栏项设置到导航控制器上。
我希望有所帮助!
答案 2 :(得分:0)
我猜测该项目没有显示,因为它的视图中没有任何内容。您确定项目中有一个名为Reply_Message.png
的图像吗? [UIImage imageNamed:@"Reply_Message.png"]
可能是nil
。
答案 3 :(得分:0)
您可以在整个应用中使用一个工具栏,而无需使用导航控制器工具栏。由于您的代码使用非navigationController工具栏,这可能是实现您想要的最简单方法。在您的应用委托中,尝试向窗口添加工具栏,就像这样。这样它在整个应用程序中都是持久的。确保您考虑使用一种方案来访问工具栏以添加/删除按钮,或者从不同的视图控制器中隐藏/显示它们。
- (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];
}