使用UINavigationcontrol进行UISegmentedcontrol - UISC消失

时间:2011-01-20 13:54:07

标签: objective-c uisegmentedcontrol navigationitem

我有一个带UISegmentedcontrol的UINavigationcontrol和两个选项。这两个选项推送到不同的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


Okey,当我尝试使用它时,分段控制从一开始就消失了。我用:

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已经在开始视图中消失了(步骤3)。

有什么建议吗? :)

1 个答案:

答案 0 :(得分:0)

以下是有关如何更新导航栏的文档;

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

一般情况下,我不会外化视图控制器的navigationItem中的内容。而是让堆栈中的每个视图控制器实现viewWillAppear,将正确的titleView放入其自己的navigationItem中。例如,在上面引用的Step3类中

... Step3.m

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

这样做可以消除CoreDataMenuAppDelegate的责任,使其无需了解所有视图控制器的内部细节。

此外,从WWDC 2010查看模型 - 视图 - 控制器对话可能会有所帮助;

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

演讲是针对iPhone OS的Session 116 Model-View-Controller。

会话116充满了关于如何考虑视图控制器以及类之间功能分离的信息。具体来说,演示者讨论了尊重控制器类之间封装的重要性。