0

UISegmentedcontrol と 2 つのオプションを備えた UINavigationcontrol があります。2 つのオプションは、異なる UIViewcontrollers にプッシュします。ユーザーが 2 番目のオプションを押すと、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;

しかし、結果はありません。

UIViewController に移動すると、2 番目のセグメントを押すと UISegmentControl が表示されますが、最初のセグメントに戻ると消えます。

誰?

よろしく、 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.h/m でまったく同じコードを使用していますが、スニペットを試すと、Segmentedcontrol が既に開始ビュー (step3) に表示されなくなります。

助言がありますか?:)

4

1 に答える 1

0

ナビゲーション バーの更新方法に関するドキュメントは次のとおりです。

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

一般に、View Controller の navigationItem にあるものを外部化することはしません。代わりに、スタック内の各View ControllerにviewWillAppearを実装させて、正しいtitleViewを独自のnavigationItemに配置します。たとえば、上記で参照した Step3 クラスでは

Step3.m...

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

これを行うと、CoreDataMenuAppDelegate の責任がなくなり、すべてのビュー コントローラーの内部の詳細を知る必要がなくなります。

また、WWDC 2010 の Model-View-Controller トークも参考になるかもしれません。

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

トークはSession 116 Model-View-Controller for iPhone OSです。

セッション 116 では、View Controller の考え方やクラス間の機能分割についての情報が満載です。具体的には、プレゼンターは、コントローラー クラス間のカプセル化を尊重することがいかに重要であるかについて説明します。

于 2011-01-20T14:19:07.090 に答える