UISegmentedcontrol с UINavigationcontrol - UISC исчезает - PullRequest
0 голосов
/ 20 января 2011

У меня есть UINavigation control с UISegmentedcontrol и двумя вариантами.Эти две опции выдвигают различные контроллеры UIView.Когда пользователь нажимает второй параметр, UISegmentControl все еще существует, но когда пользователь нажимает первый параметр снова, UISegmentControl исчезает.Какой код мне нужен там?

CoreDataMenuAppDelegate.h:

    #import <UIKit/UIKit.h>
@interface CoreDataMenuAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate> {


    UIWindow *window;
    UINavigationController *navigationController;
    UINavigationController *navigationController2;
    UITabBarController *tabBarController;
    IBOutlet UISegmentedControl *myMent;
}

-(IBAction)segmentAction:(id)sender;

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController2;
@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;

@end

CoreDataMenuAppDelegate.m:

    #import "CoreDataMenuAppDelegate.h"
    #import "RootViewController.h"
    #import "Step3.h"
    #import "Step6.h"

    @implementation CoreDataMenuAppDelegate

    @synthesize window;
    @synthesize navigationController;
    @synthesize navigationController2;
    @synthesize tabBarController;

    -(void)viewDidLoad
    {

     [myMent addTarget:self action:@selector(segmentAction:)
      forControlEvents:UIControlEventValueChanged];
     myMent.selectedSegmentIndex = 0 ;
    }
    - (IBAction) segmentAction:(id)sender 
 UISegmentedControl* segCtl = sender ;

 if( [segCtl selectedSegmentIndex] == 0 )
 {
  [navigationController2 popToRootViewControllerAnimated:NO];

//What to put here?

 }
 if( [segCtl selectedSegmentIndex] == 1 ) 
 {
  NSLog(@"hi this is second segment");
  Step6 *step6 = [[[Step6 alloc] initWithNibName:@"Step6" bundle:nil] autorelease];
  [self.navigationController2 pushViewController:step6 animated:NO];
  step6.navigationItem.titleView = segCtl;
 }

}

    - (void)dealloc {
        [navigationController release];
     [navigationController2 release];
     [tabBarController release];
     [window release];
     [super dealloc];
    }

Я пробовал:

Step3 *step3 = [[[Step3 alloc] initWithNibName:@"Step3"
step3.navigationItem.titleView = segCtl;

но без результатов.

UISegmentControl показывает, когда я перехожу к UIViewController, когда я нажимаю второй сегмент, но исчезает, когда я возвращаюсь к первому сегменту.

Кто-нибудь?

С наилучшими пожеланиями, xqtr


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

Step3.h:

#import <UIKit/UIKit.h>
@interface Step3 : UIViewController {
UISegmentedControl    * segmentedControl;
}
@property (nonatomic, retain) IBOutlet UISegmentedControl * segmentedControl;
@end

Step3.m:

#import "Step3.h"
@implementation Step3
@synthesize segmentedControl;

- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.navigationItem.titleView = self.segmentedControl;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}


- (void)viewDidUnload {
}

- (void)dealloc {
    [super dealloc];
}

@end

Я использую точно такой же код в step3.h / m и step6.ч / м, но теперь, когда я попробовал ваш фрагмент, Сегментированный контроль исчезает уже в стартовом представлении (шаг 3).

Есть предложения?:)

1 Ответ

0 голосов
/ 20 января 2011

Вот документы о том, как происходит обновление навигационной панели;

http://developer.apple.com/library/ios/DOCUMENTATION/UIKit/Reference/UINavigationController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006934-CH3-SW25

В общем, я бы не стал выводить то, что должно быть в элементе навигации для контроллера представления. Вместо этого пусть каждый контроллер представления в вашем стеке реализует viewWillAppear, чтобы поместить правильный titleView в свой собственный навигационный элемент. Например, в классе Step3, на который вы ссылаетесь выше

Step3.m ...

- (void)viewWillAppear:(BOOL)animated {
  [super viewWillAppear:animated];
  self.navigationItem.titleView = self.segmentedControl;
}

Выполнение этого снимает с CoreDataMenuAppDelegate ответственность за необходимость знать внутренние детали всех ваших контроллеров представления.

Также может помочь просмотр разговора Model-View-Controller из WWDC 2010;

http://developer.apple.com/videos/wwdc/2010/

Речь идет о Session 116 Model-View-Controller для iPhone OS.

Сессия 116 полна информации о том, как думать о контроллерах представления и распределении функциональности между классами. В частности, докладчик обсуждает, насколько важно соблюдать инкапсуляцию между классами вашего контроллера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...