我有一个带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)。
有什么建议吗? :)
答案 0 :(得分:0)
以下是有关如何更新导航栏的文档;
一般情况下,我不会外化视图控制器的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充满了关于如何考虑视图控制器以及类之间功能分离的信息。具体来说,演示者讨论了尊重控制器类之间封装的重要性。