문제

내 앱에는 UinavigationControllers가있는 UitabbarController가 있습니다.

UINavigationController *newsNavigationController = [[UINavigationController alloc] initWithRootViewController: newsViewControler];

NewsViewController는 UIViewController입니다. Tabbar의 버튼을 눌러 NewsViewController와 함께 탐색 항목을 표시하면 탐색 표시 줄의 제목이 정상입니다. NewsViewController에는 Init 이후에 전화하는 메소드 설정이 있습니다. 설정 메소드에서 이와 같이 제목을 설정합니다.[[self navigationItem] setTitle:[category_c title]];

NewsViewController에는 테이블 뷰가 있습니다. 셀을 터치 할 때 선택한 뉴스와 내비게이션 바에서 제목을 표시하기 위해 UIViewController를 푸시하고 싶습니다.

UIViewController에는 위와 같은 제목을 설정하는 동일한 설정 방법이 있습니다. 문제는 표시되지 않습니다. 내비게이션 항목은 전화를 걸 수 있기 때문에 무효가되지 않습니다. self.navigationItem.hidesBackButton = YES; 그리고 그것은 매번 백 버튼을 숨기지 만 제목은 표시되지 않습니다.

셀이 닿을 때 뉴스를 만들고 밀어 넣습니다.

if(newsViewController == nil){
        newsViewController = [[NewsViewController alloc] init];
        [newsViewController setup];
    }
    [self.navigationController pushViewController: newsViewController animated:YES];

NewsViewController의 설정 방법은 다음과 같습니다.

- (void) setup {
    self.navigationItem.hidesBackButton = YES;
    [self.navigationItem setTitle:@"my view"];
}

NewsViewController에서는 ViewDidload가 있고 타이틀을 설정하려고했지만 성공하지 못했습니다.

  • (void) viewDidload {self.navigationItem.title = @"test"; [슈퍼 뷰 디드로드]; }

후에 [self.navigationController pushViewController: newsViewController animated:YES];나는 쓴다 [[self.navigationController.viewControllers objectAtIndex:0] setTitle:@"myTitle"]; uitableview가 포함 된 UiviewController는 셀을 만질 때 밀어 넣은 NewsViewController 대신 제목 MyTitle을 가져옵니다.

어떤 포인터? 제목이 올바르게 설정되지 않은 이유를 이해할 수 없습니다.

EDIT2 : Debugger를 단계별로 읽고 코드를 살펴보고 rootViewControllers를 ChildViewControllers와 비교 한 후 Self.title = @"thit 만들어 져서 그것은 NIL 상황이 아닙니다. 디버거에서 _navigationItem 변수를 확장 할 때 필드 _NavigationBar는 viewDidLoad를 떠난 후 필드 _NavigationBar가됩니다. rootViewControllers에서는 NavigationBar가 NULL이 아니며 제목이 있습니다. NavigationBar가 NULL이면 제목이 표시되지 않는다는 것을 읽었습니다. 이미지에는 디버거에서 본 것이 있습니다. Alt Text http://img138.imageshack.us/img138/1513/picture2bq.png 이제 나는이 방향으로 찾고 있습니다.

edit1 : 아래는 ParentViewController, FirstChildViewController 및 Second ChildViewController의 코드입니다. ParentViewController가 보입니다 (제목은 괜찮습니다). Bearbeitenaction이라고 부르는 NavigationBar의 버튼을 누릅니다.> 첫 번째 자녀가 밀려납니다 (제목이 표시되지 않음). FirstChildViewController의 내비게이션 표시 줄에는 눌렀을 때 스택에서 새 ViewController를 누르는 버튼이 있습니다 (SecondViewController). 두 번째 ChildViewController의 제목은 괜찮지 않습니다. FirstChildViewController의 제목을 다시 누르면 괜찮습니다.

ParentViewController :

    //MARK: -
    //MARK: Initialization methods
    - (void) setup {
        dataManipulator = [[DataManipulation alloc] init];
        dataManipulator.delegate = self;

        [self.tabBarItem initWithTitle:[NSString stringWithFormat:@"%@",[category_c title]] image:[UIImage newImageFromResource:[category_c icon]] tag:0];

        searchResults = nil;
        companyDetailsPushed = NO;
    }

    //MARK: -
    //MARK: ViewControllerMethods
    // Implement loadView to create a view hierarchy programmatically, without using a nib.
    - (void) loadView {
        NSLog(@"WatchlistViewController: loadView");

        UIView *mainView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, [[UIScreen mainScreen] applicationFrame].size.width, [[UIScreen mainScreen] applicationFrame].size.height)] autorelease];
        [mainView setBackgroundColor:[UIColor whiteColor]];
        mainView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
        mainView.contentMode = UIViewContentModeScaleToFill;
        [mainView setAutoresizesSubviews:YES];

            companiesTable = [[UITableView alloc] initWithFrame:CGRectMake(0, 44, [[UIScreen mainScreen] applicationFrame].size.width, 322)];
        companiesTable.delegate = self;
        companiesTable.dataSource = self;
        [mainView addSubview:companiesTable];
        [companiesTable release];

            self.view = mainView;
    }

    - (void)viewDidLoad {
        [super viewDidLoad];
        if(![[category_c subtitle] isEqualToString:@""]) {
            self.title = [category_c subtitle];
        }
        else {
            self.title = [category_c title];
        }
    }

    - (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

        if(companyDetailsViewController == nil) {
            companyDetailsViewController = [[CompanyDetailsScrollViewController alloc] init];
            [companyDetailsViewController setup];
        }

        [watchlistDoneBtn setHidden:TRUE];
        companyDetailsPushed = YES;

        if(viewMode == SearchViewMode)
            [companyDetailsViewController setCompany:[searchResults objectAtIndex:indexPath.row]];
        else if(viewMode == WatchlistViewMode)
            [companyDetailsViewController setCompany:[[[Financial_deAppDelegate sharedAppDelegate] watchlistCompanies] objectAtIndex:indexPath.row]];

        [[self navigationController] pushViewController:companyDetailsViewController animated:YES];
    }

- (void) bearbeitenAction:(UIButton *) sender {
    NSLog(@"Berbeiten btn was pressed");
    if(berbeitenViewController == nil){
        berbeitenViewController = [[BerbeitenViewController alloc] init];
        [berbeitenViewController setup];
    }
    [self.navigationController pushViewController:berbeitenViewController animated:YES];
}

Code의 FirstChildViewController = BerbeitenViewController :

- (void) setup {
    self.navigationItem.hidesBackButton = YES;
}

// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
    NSLog(@"BerbeitenViewController: loadView");

    UIView *mainView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, [[UIScreen mainScreen] applicationFrame].size.width, [[UIScreen mainScreen] applicationFrame].size.height)] autorelease];
    [mainView setBackgroundColor:[UIColor darkGrayColor]];
    mainView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    mainView.contentMode = UIViewContentModeScaleToFill;
    [mainView setAutoresizesSubviews:YES];

    berbeitenBackBtn = [[UIButton alloc] initWithFrame:CGRectMake(5, 23, 69, 36)];
    [berbeitenBackBtn setBackgroundImage:[UIImage newImageFromResource:@"back_btn.png"] forState:UIControlStateNormal];
    [berbeitenBackBtn addTarget:self action:@selector(popViewController:) forControlEvents:UIControlEventTouchUpInside];
    [berbeitenBackBtn setEnabled:TRUE];
    [self.navigationController.view addSubview:berbeitenBackBtn];
    [berbeitenBackBtn release];

    berbeitenAddBtn = [[UIButton alloc] initWithFrame:CGRectMake(260, 23, 55, 36)];
    [berbeitenAddBtn setBackgroundImage:[UIImage newImageFromResource:@"bearbeiten_add_btn.png"] forState:UIControlStateNormal];
    [berbeitenAddBtn addTarget:self action:@selector(addCompany:) forControlEvents:UIControlEventTouchUpInside];
    [berbeitenAddBtn setEnabled:TRUE];
    [self.navigationController.view addSubview:berbeitenAddBtn];
    [berbeitenAddBtn release];

    companiesTable = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, [[UIScreen mainScreen] applicationFrame].size.width, 366)];
    companiesTable.delegate = self;
    companiesTable.dataSource = self;
    [mainView addSubview:companiesTable];
    [companiesTable release];

    self.view = mainView;
}

- (void)viewDidLoad {
    NSLog(@"BerbeitenViewController viewDidLoad");
    [super viewDidLoad];
    self.title = @"Edit watchlist";
}

//MARK: Buttons actions

- (void) popViewController:(UIButton *) sender {
    NSLog(@"Pop BerbeitenViewController");
    [self.navigationController popViewControllerAnimated:YES];
}

- (void) addCompany:(UIButton *) sender {
    NSLog(@"Berbeiten addCompany btn pushed");
    if(searchViewController == nil){
        searchViewController = [[SearchViewController alloc] init];
        [searchViewController setup];
    }
    [self.navigationController pushViewController:searchViewController animated:YES];
}

Code의 SearchViewController = SearchViewController입니다

- (void) setup {
    self.navigationItem.hidesBackButton = YES;
}

// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
    NSLog(@"BerbeitenViewController: loadView");

    UIView *mainView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, [[UIScreen mainScreen] applicationFrame].size.width, [[UIScreen mainScreen] applicationFrame].size.height)] autorelease];
    [mainView setBackgroundColor:[UIColor darkGrayColor]];
    mainView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    mainView.contentMode = UIViewContentModeScaleToFill;
    [mainView setAutoresizesSubviews:YES];

    searchViewBackBtn = [[UIButton alloc] initWithFrame:CGRectMake(5, 23, 69, 36)];
    [searchViewBackBtn setBackgroundImage:[UIImage newImageFromResource:@"back_btn.png"] forState:UIControlStateNormal];
    [searchViewBackBtn addTarget:self action:@selector(popViewController:) forControlEvents:UIControlEventTouchUpInside];
    [searchViewBackBtn setEnabled:TRUE];
    [self.navigationController.view addSubview:searchViewBackBtn];
    [searchViewBackBtn release];

    self.view = mainView;
}


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];
    self.title = @"Edit Watchlist";
}
도움이 되었습니까?

해결책 3

문제의 출처는이 주소에서 찾은 방법을 사용하여 추가 한 NavigationBar의 사용자 정의 배경 이미지였습니다. http://sebastiancelis.com/ . 기본적으로 일어난 일은 저자로부터 인용했다.

카테고리를 사용하면 UinavigationBar 또는 UinavationController를 만들 때마다 자체 PetbackgroundImage를 쉽게 추가하고 호출 할 수 있습니다. 이 메소드는 UIIMAGEVIEW를 탐색 표시 줄에 서브 뷰로 추가 한 다음 해당 하위 뷰를 수퍼 뷰 뒷면으로 보냅니다.

그러나 이것을 시도하면 그것이 일종의 효과가 있다는 것을 빨리 알게 될 것입니다. UIIMAGEVIEW는 확실히 보이며 처음에는 올바른 Z-INDEX에 있습니다. 그러나 뷰 컨트롤러를 탐색 컨트롤러 스택으로 밀거나 팝하면 배경 이미지가 더 이상 백그라운드에 있지 않음을 알 수 있습니다. 대신 제목 및 내비게이션 바 버튼을 차단합니다. 이것은 확실히 우리가 원하는 것이 아닙니다.

내비게이션 바의 배경을 변경하기위한이 솔루션을 찾았을 때 나는 그것을 제대로 얻었을 것이라고 확신했지만 .. 그렇지 않은 것 같습니다.

시간 내 주셔서 다시 한 번 감사드립니다!

다른 팁

#2 편집

나는 당신의 코드를 살펴 보았고 모든 것이 괜찮아 보입니다. 나에게 제자리를 벗어난 유일한 것은 자식 컨트롤러의 NavigationItem을 사용하는 대신 내비게이션 컨트롤러에 하위 뷰를 추가한다는 것입니다. 나는 그것을 이런 식으로 본 적이 없다. 각 ViewController는 다음에 있습니다 uinavigationitem View Controller가 내비게이션 막대에 푸시 될 때를 나타내는 속성. 일부 배경에 대한 설명서의 개요를 읽으십시오.

해당 NavigationItem은 제목, 왼쪽 버튼 및 오른쪽 버튼을 설정할 수 있습니다 ... 버튼을 해당 속성으로 설정하려고합니다. 내비게이션 컨트롤러에 하위 뷰를 추가하면 제목으로 펑키 한 일을 할 수 있기 때문입니다. , 나는 그것이 당신이하는 방식으로 그것을 본 적이 없기 때문에 그것이 옳고 그른지 확실하지 않습니다. 당신이해야 할 유일한 변경 사항은 버튼을 uibarbuttonitem 클래스로 변경하는 것입니다. 시도 해봐.

원래의

루트 뷰 컨트롤러는 배열의 색인 0에 있습니다 ... 따라서이 작업을 수행하는 경우 :

[[self.navigationController.viewControllers objectAtIndex:0] setTitle:@"myTitle"]

항상 루트의 제목을 설정합니다. 다음과 같이 시도하십시오.

objectAtIndex:([self.navigationController.viewControllers count] - 1)

어린이 컨트롤러의 ViewWillAppear 메소드에서 이러한 종류의 설정을 수행하는 것이 더 쉬울 수도 있습니다. 따라서 올바른 뷰 컨트롤러를 위해 내비게이션 컨트롤러의 어린이를 통해 검색 할 필요가 없습니다.

도움이 되었기를 바랍니다

편집하다init 메소드에서 제목을 설정할 수 있습니다.

-(id)init {
    if (self = [super init]) {
        self.title = @"My Title";
    }
    return self;
}

이런 식으로, 당신은 객체의 init 메소드가 객체의 값을 초기화하는 것을 담당하도록 허용합니다 (좋은 것).

당신은 움직여야합니다 setup 코드 viewDidLoad 대신 방법. 그만큼 viewDidLoad 내비게이션 항목이 이미 설정되었을 때 호출됩니다.

제목을 설정하려면 간단히 사용하십시오 self.title = @"my view"; - NavigationItem에서 직접 제목을 설정해서는 안됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top