当通过selectedSegmentIndex从外部调用时,段控制器的切换在UISegmentControl中不起作用

时间:2018-02-12 16:58:50

标签: ios objective-c uiviewcontroller uisegmentedcontrol

我正在使用带有UISegment的视图控制器。

点击分段控制器而不是导航到UIVIew我正在使用UIVIEWcontrolers。

这是我的代码

.h文件

@property (weak, nonatomic) IBOutlet UIView *containerView;
@property (weak, nonatomic) IBOutlet UISegmentedControl *segmenter;

- (IBAction)showComponent:(UISegmentedControl *)sender;

@property (weak, nonatomic) UIViewController *currentViewController;
-(void)loadViewFromData;

.m文件

- (void)viewDidLoad {
    [super viewDidLoad];
    AppDelegate *appD = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    if ([[appD.defaults objectForKey:@"segment"] isEqualToString:@"index0"]) {
        self.currentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"viewControllr1"];
        self.segmenter.selectedSegmentIndex = 0;
        [self.segmenter sendActionsForControlEvents:UIControlEventValueChanged];

    }else{
        self.currentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"viewControllr2"];
        self.segmenter.selectedSegmentIndex = 1;
        [self.segmenter sendActionsForControlEvents:UIControlEventValueChanged];
    }
//    self.currentViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
//    [self addChildViewController:self.currentViewController];
//    [self addSubview:self.currentViewController.view toView:self.containerView];
//    //[self changeSegment];
    [self.segmenter addTarget:self action:@selector(changedSegmentedControl:) forControlEvents:UIControlEventValueChanged];

    // Do any additional setup after loading the view.
}
- (void)changedSegmentedControl:(UISegmentedControl*)sender
{
    NSLog(@"Changed value of segmented control to %ld", sender.selectedSegmentIndex);
    NSLog(@"self.segmenter value of segmented control to %ld", self.segmenter.selectedSegmentIndex);
    // Code to change View Controller goes here
}
-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:YES];
}
-(void)loadViewFromData{
//    [self viewDidLoad];
//    [self viewWillAppear:YES];
//    [self reloadInputViews];
    self.segmenter.selectedSegmentIndex = 1;
    [self changedSegmentedControl:self.segmenter];
    [self.segmenter sendActionsForControlEvents:UIControlEventValueChanged];
}
-(void)changeSegment{
    AppDelegate *appD = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    if ([[appD.defaults objectForKey:@"segment"] isEqualToString:@"index0"]) {
        self.currentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"viewControllr1"];
    }else{
        self.currentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"viewControllr2"];
        self.segmenter.selectedSegmentIndex = 1;
    }
    self.currentViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
    [self addChildViewController:self.currentViewController];
    [self addSubview:self.currentViewController.view toView:self.containerView];
}
- (IBAction)showComponent:(UISegmentedControl *)sender {
    if (sender.selectedSegmentIndex == 0) {
        UIViewController *newViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"viewControllr1"];
        newViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
        [self cycleFromViewController:self.currentViewController toViewController:newViewController];
        self.currentViewController = newViewController;
    } else {
        UIViewController *newViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"viewControllr2"];
        newViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
        [self cycleFromViewController:self.currentViewController toViewController:newViewController];
        self.currentViewController = newViewController;
    }
}

- (void)cycleFromViewController:(UIViewController*) oldViewController
               toViewController:(UIViewController*) newViewController {
    [oldViewController willMoveToParentViewController:nil];
    [self addChildViewController:newViewController];
    [self addSubview:newViewController.view toView:self.containerView];
    newViewController.view.alpha = 0;
    [newViewController.view layoutIfNeeded];

    [UIView animateWithDuration:0.5
                     animations:^{
                         newViewController.view.alpha = 1;
                         oldViewController.view.alpha = 0;
                     }
                     completion:^(BOOL finished) {
                         [oldViewController.view removeFromSuperview];
                         [oldViewController removeFromParentViewController];
                         [newViewController didMoveToParentViewController:self];
                     }];
}

- (void)addSubview:(UIView *)subView toView:(UIView*)parentView {
    [parentView addSubview:subView];
    NSDictionary * views = @{@"subView" : subView,};
    NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[subView]|"
                           options:0
                            metrics:0
                            views:views];
    [parentView addConstraints:constraints];
    constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[subView]|"
                                                          options:0
                                                          metrics:0
                                                            views:views];
    [parentView addConstraints:constraints];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

我从另一个视图控制器调用loadViewFromData并将appD.defults值更改为“index1”但不重定向

如果我试图通过代码选择第二个片段,即通过selectedSegmentIndex从外部调用,则它无法正常运行且无法重定向。

如果我单击并选择一个正常运行的片段,则手动。

0 个答案:

没有答案