iPhone - backBarButtonItem равен нулю и не выделяется при касании - PullRequest
0 голосов
/ 20 марта 2011

У меня есть полноэкранный модальный вид, вызываемый с помощью:

PreferencesController *nextWindow = [[[PreferencesController alloc] initWithNibName:@"Preferences" bundle:nil] autorelease];
UINavigationController* navController = [[[UINavigationController alloc] initWithRootViewController:nextWindow] autorelease];
[self presentModalViewController:navController animated:YES];

Затем из этого модального вида я выдвигаю другой вид:

MyController *nextWindow = [[[MyController alloc] initWithNibName:@"tmp" bundle:nil] autorelease];
[self.navigationController pushViewController:nextWindow animated:YES];

В этом новом контроллере у меня есть этот viewDidLoad:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.title = @"Borders";
    self.navigationController.navigationBarHidden = NO;
}

В таком случае backBarButtonItem не активен, я имею в виду, что касание его не выделяет его и не возвращает к предыдущему представлению.

На самом деле self.navigationController.navigationItem.backBarButtonItem являетсяNIL.
self.navigationController.navigationItem не равен NIL
self.navigationController для вызывающего и внутреннего вызываемого представления имеют одинаковые ссылки.

В чем проблема?

Ответы [ 3 ]

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

Убедитесь, что вы nextWindow UIViewController имеет ссылку на UINavigationController.

Обновление # 1

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

Прошу прощения за предыдущий ответ, я был совершенно неправ, надеюсь, это поможет вам.

Обновление # 2

Пожалуйста, попробуйте это перед тем, как нажать UIViewController:

UIButton* backButton = [UIButton buttonWithType:101]; 
[backButton addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside]; [backButton setTitle:Title forState:UIControlStateNormal]; 
UIBarButtonItem *iButton = [[UIBarButtonItem alloc] initWithCustomView:backButton];     
self.navigationController.navigationItem.leftBarButtonItem = iButton;

Обновление # 3

копирование и вставка метода definePreferences в ваш проект

 -(IBAction) definePreferences:(id)sender {

 PreferencesController *nextWindow = [[PreferencesController alloc] initWithNibName:@"Preferences" bundle:nil] ;
 nextWindow.caller = self;
 UINavigationController* navController = [[UINavigationController alloc] initWithRootViewController:nextWindow];
 [self presentModalViewController:navController animated:YES];
}

Обновление # 4

  • Я добавил панель навигации вPrefferences 2 Nib file
  • Затем связал его с IBOutlet типа UINavigationItem в Prefferences 2 UIViewController
  • В ViewDidLoad: of Prefferences2 UIViewController: добавьте следующий код, чтобы убедиться, что добавляется элемент левой панели[1]
  • Затем функция, которая будет обрабатывать возврат назад [2]

[1]

 -(void)viewDidLoad {
[super viewDidLoad];

UIButton* backButton = [UIButton buttonWithType:101];
[backButton addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];

[backButton setTitle:@"Helo" forState:UIControlStateNormal];
UIBarButtonItem* iButton = [[UIBarButtonItem alloc] initWithCustomView:backButton]; 

self.oUINavigationItem.leftBarButtonItem = iButton;}

[2]

-(IBAction)buttonPressed:(id)sender
{
    [self.navigationController popViewControllerAnimated:YES];
}

пожалуйста, дайте мне знать, если вам нужно, чтобы я объяснил больше.

0 голосов
/ 22 марта 2011

У меня есть окончательное решение.
Фактически, существует проблема, когда новый контроллер используется из наложения камеры для отображения нового вида.
В какой-то момент панель навигации не работает.
Чтобы все работало нормально, вы должны вызывать первый вид не из себя (оверлей), а из самого ImagePicker. Поэтому на оверлее необходимо сохранить ссылку на сборщик:

self.picker = [[UIImagePickerController alloc] init];

[some initialisation of the picker]

// Insert the overlay
self.overlay = [[OverlayViewController alloc] initWithNibName:@"Overlay" bundle:nil];
-- HERE --self.overlay.pickerRef = self.picker;
self.picker.cameraOverlayView = self.overlay.view;

[self presentModalViewController:self.picker animated:NO];

Затем в оверлее:

- (IBAction) click:(id)sender {

    PreferencesController *nextWindow = [[[PreferencesController alloc] initWithNibName:@"Preferences" bundle:nil] autorelease];
    UINavigationController* navController = [[[UINavigationController alloc] initWithRootViewController:nextWindow] autorelease];

    -- DO --      [self.pickerRef presentModalViewController:navController animated:YES];
    -- DONT DO -- [self presentModalViewController:navController animated:YES];
}

Тогда больше никаких проблем с навигацией ...

0 голосов
/ 20 марта 2011

Когда вы помещаете контроллер представления в контроллер навигации, его backBarButtonItem будет установлен для возврата к предыдущему контроллеру представления, а не leftBarButtonItem. Если вы установите leftBarButtonItem, backBarButtonItem будет скрыт, и то же место будет заменено leftBarButtonItem.

И ваш код вообще не устанавливает leftBarButtonItem, поэтому, конечно, это ноль.

EDIT: Мои тестовые коды. Я проверил backButtonItem и leftBarButtonItem с помощью следующих кодов, и они равны нулю. Вы правы. Но когда я коснулся кнопки «Назад» к предыдущему виду, ее цвет изменился, поэтому он был выделен. И это сработало хорошо до предыдущего представления контроллера Так что я думаю, что ваш код неправильный в каком-то другом месте, это делает кнопку возврата неактивной.

Листинг 1, класс RootViewController

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

@interface RootViewController : UIViewController {
}
@end

// RootViewController.m
#import "RootViewController.h"
#import "MyViewController.h"

@implementation RootViewController

- (void)viewDidLoad {
    [super viewDidLoad];

self.title = @"RootView";

MyViewController *childView = [[[MyViewController alloc] init] autorelease];
UINavigationController *navCtrl = [[[UINavigationController alloc] initWithRootViewController:childView] autorelease];

[self.navigationController presentModalViewController:navCtrl animated:YES];
}
@end

Листинг 2, MyViewController

// MyViewController.h
    #import <UIKit/UIKit.h>
@interface MyViewController : UIViewController {
}
@end

// MyViewController.m
#import "MyViewController.h"
#import "MyAnotherViewController.h"

@implementation MyViewController

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];

    self.title = @"MyView";

    NSLog(@"%s backBarButtonItem:%@ leftBarButtonItem:%@",__FUNCTION__ ,self.navigationItem.backBarButtonItem, self.navigationItem.leftBarButtonItem);
    MyAnotherViewController *childView = [[[MyAnotherViewController alloc] init] autorelease];
    [self.navigationController pushViewController:childView animated:YES];

}

@end

Листинг 3, MyAnotherViewController

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

@interface MyAnotherViewController : UIViewController {
}

@end

// MyAnotherViewController.m
#import "MyAnotherViewController.h"
@implementation MyAnotherViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.title = @"Another View";
}

@end
...