1

Я пытаюсь использовать панель инструментов NavigationController в своем приложении. Эта панель инструментов панели инструментов должна меняться в зависимости от того, какой контроллер представления представлен. это очень просто.Панель инструментов uinavigationController с пользовательскими элементами

Что я пытаюсь сделать, так это добавить пользовательские кнопки на панель инструментов с помощью метода initWithCustomView: "UIBarButtonItem. Однако кнопка не появится на панели инструментов. Но если я создаю UIBarButtonItem, используя метод «initWithTitle:» или «initWithBarButtonSystemItem:», появится кнопка. Например, посмотрите на код ниже:

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:», заключается в том, что один из значков окрашен, и это единственный способ показать цвет на обычной панели инструментов. Теперь я просмотрел документацию по яблокам и не упоминается, почему метод initWithCustomView: не мог быть вызван (или, может быть, я не смог его найти).

Может ли кто-нибудь просветить свет на эту тему, чтобы помочь мне указать в правильном направлении. Спасибо заранее, ребята.

+0

имеют ту же проблему. Интересно, почему он не работает ... Мне может понадобиться просто добавить другую панель инструментов с надписью «add subview». –

ответ

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]; 

Попробуйте эти крошечные изменения, возможно, он будет работать :)

0

Я бы предположил, что элемент не отображается, потому что его вид в нем не имеет ничего. Вы уверены, что в вашем проекте есть изображение под названием Reply_Message.png? [UIImage imageNamed:@"Reply_Message.png"] бывает nil.

+0

Я уверен в этом. Если я возьму тот же самый точный код и задаю эти элементы на панели инструментов, которую я создаю, появится кнопка. Это не проблема. Я даже попробовал UIButton только с заголовком, а не с изображением, добавив это как subview в UIBarButtonItem, и даже это не появится. – Bittu

0

Вы можете использовать одну панель инструментов во всем приложении, не используя панель инструментов навигационных контроллеров. Поскольку ваш код работает с панелью управления non-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]; 
} 
+2

Благодарим вас за ответ Дрю. Я уже думал об этой идее. Если бы у меня было приложение, которое использовало navigationController в качестве его rootViewController, это могло бы сработать. Скорее, я использую эту панель запуска библиотеки Three20 в качестве корневого представления, причем каждое «суб-приложение» содержит свои собственные настройки. У некоторых есть табуляции, в то время как у других есть navigationController или splitviewController. По этой причине я старался не добавлять что-либо к самому окну. решение, которое я придумал, заключалось в том, чтобы добавить свою собственную панель инструментов в качестве представления subview для navigationController. – Bittu

1

У меня была та же проблема. Оказывается, панель инструментов для UINavigationController сбрасывает свои элементы каждый раз, когда новое представление попадает в стек.Я пытался установить элементы панели инструментов в функции applicationDidFinish, и она не работала. Он работал, как только я установил панель инструментов itms в функции view (вид) viewDidAppear viewController, которая была нажата в стек навигации.

Итак, если вы хотите, чтобы контроллер навигации сохранял одни и те же элементы панели инструментов во всем приложении, вы должны установить элементы панели инструментов в каждом представлении, которые вы нажимаете на контроллер навигации после появления представления.

Я надеюсь, что это поможет!