Панель инструментов uinavigationController с пользовательскими элементами - PullRequest
1 голос
/ 28 июля 2010

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

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

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

Ответы [ 4 ]

1 голос
/ 02 августа 2012

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

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

Надеюсь, это поможет!

1 голос
/ 30 марта 2011

Я не вижу отличий от того, что вы пытались, но в итоге у меня получилось, с таким кодом:

 //////////////////////////////////////////////////////////////////////////////////////////////
/////>>>> 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 голосов
/ 20 августа 2010

Вы можете использовать одну панель инструментов во всем приложении, не используя панель инструментов контроллеров навигации. Поскольку ваш код работает с панелью инструментов, не относящейся к навигационному контроллеру, это может быть самым простым способом выполнить то, что вы хотите. В делегате приложения попробуйте добавить панель инструментов в окно, например так. Таким образом, это постоянно в приложении. Убедитесь, что вы рассматриваете схему, которая позволит вам получить доступ к панели инструментов для добавления / удаления кнопок, или скрыть / показать ее из разных контроллеров представления.

    - (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];
}
0 голосов
/ 28 июля 2010

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

...