gpt4 book ai didi

ios - 分段控制更改时更改 View Controller

转载 作者:技术小花猫 更新时间:2023-10-29 10:40:48 24 4
gpt4 key购买 nike

这个问题快把我逼疯了。当用户更改分段控件的选定“选项卡”时,我试图更改 viewController。我花了几个小时进行研究,但未能找到有效的答案或通过 Storyboard完成的答案。

这真的很困扰我,因为设置选项卡应用程序是如此简单,但是尝试像选项卡应用程序一样使用分段控件就是行不通。我已经知道如何检测在分段控件中选择了哪个索引。我怎样才能做到这一点?

非常感谢。

最佳答案

注意:答案更新为 iOS 5+ 的 View Controller 包含代码,包括 @interface 部分

在我的一个应用程序中,我在导航栏中有一个带有段控件的 View Controller ,单击“选项卡”切换 View Controller 。基本思想是拥有一个 View Controller 数组,并使用段索引(和 indexDidChangeForSegmentedControl IBAction)在它们之间切换。

我的应用程序中的示例代码(iOS 5 或更高版本)(这是针对 2 个 View Controller 的,但它很容易扩展到多个 View Controller );代码比 iOS 4 稍长,但会保持对象图的完整性。此外,它使用 ARC:

@interface MyViewController ()
// Segmented control to switch view controllers
@property (weak, nonatomic) IBOutlet UISegmentedControl *switchViewControllers;

// Array of view controllers to switch between
@property (nonatomic, copy) NSArray *allViewControllers;

// Currently selected view controller
@property (nonatomic, strong) UIViewController *currentViewController;
@end

@implementation UpdateScoreViewController
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];

// Create the score view controller
ViewControllerA *vcA = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewControllerA"];

// Create the penalty view controller
ViewControllerB *vcB = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewControllerB"];

// Add A and B view controllers to the array
self.allViewControllers = [[NSArray alloc] initWithObjects:vcA, vcB, nil];

// Ensure a view controller is loaded
self.switchViewControllers.selectedSegmentIndex = 0;
[self cycleFromViewController:self.currentViewController toViewController:[self.allViewControllers objectAtIndex:self.switchViewControllers.selectedSegmentIndex]];
}

#pragma mark - View controller switching and saving

- (void)cycleFromViewController:(UIViewController*)oldVC toViewController:(UIViewController*)newVC {

// Do nothing if we are attempting to swap to the same view controller
if (newVC == oldVC) return;

// Check the newVC is non-nil otherwise expect a crash: NSInvalidArgumentException
if (newVC) {

// Set the new view controller frame (in this case to be the size of the available screen bounds)
// Calulate any other frame animations here (e.g. for the oldVC)
newVC.view.frame = CGRectMake(CGRectGetMinX(self.view.bounds), CGRectGetMinY(self.view.bounds), CGRectGetWidth(self.view.bounds), CGRectGetHeight(self.view.bounds));

// Check the oldVC is non-nil otherwise expect a crash: NSInvalidArgumentException
if (oldVC) {

// Start both the view controller transitions
[oldVC willMoveToParentViewController:nil];
[self addChildViewController:newVC];

// Swap the view controllers
// No frame animations in this code but these would go in the animations block
[self transitionFromViewController:oldVC
toViewController:newVC
duration:0.25
options:UIViewAnimationOptionLayoutSubviews
animations:^{}
completion:^(BOOL finished) {
// Finish both the view controller transitions
[oldVC removeFromParentViewController];
[newVC didMoveToParentViewController:self];
// Store a reference to the current controller
self.currentViewController = newVC;
}];

} else {

// Otherwise we are adding a view controller for the first time
// Start the view controller transition
[self addChildViewController:newVC];

// Add the new view controller view to the ciew hierarchy
[self.view addSubview:newVC.view];

// End the view controller transition
[newVC didMoveToParentViewController:self];

// Store a reference to the current controller
self.currentViewController = newVC;
}
}
}

- (IBAction)indexDidChangeForSegmentedControl:(UISegmentedControl *)sender {

NSUInteger index = sender.selectedSegmentIndex;

if (UISegmentedControlNoSegment != index) {
UIViewController *incomingViewController = [self.allViewControllers objectAtIndex:index];
[self cycleFromViewController:self.currentViewController toViewController:incomingViewController];
}

}
@end

原始示例(iOS 4 或更早版本):

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];

// Create the score view controller
AddHandScoreViewController *score = [self.storyboard instantiateViewControllerWithIdentifier:@"AddHandScore"];

// Create the penalty view controller
AddHandPenaltyViewController *penalty = [self.storyboard instantiateViewControllerWithIdentifier:@"AddHandPenalty"];

// Add Score and Penalty view controllers to the array
self.allViewControllers = [[NSArray alloc] initWithObjects:score, penalty, nil];

// Ensure the Score controller is loaded
self.switchViewControllers.selectedSegmentIndex = 0;
[self switchToController:[self.allViewControllers objectAtIndex:self.switchViewControllers.selectedSegmentIndex]];
}

#pragma mark - View controller switching and saving

- (void)switchToController:(UIViewController *)newVC
{
if (newVC) {
// Do nothing if we are in the same controller
if (newVC == self.currentViewController) return;

// Remove the current controller if we are loaded and shown
if([self.currentViewController isViewLoaded]) [self.currentViewController.view removeFromSuperview];

// Resize the new view controller
newVC.view.frame = CGRectMake(CGRectGetMinX(self.view.bounds), CGRectGetMinY(self.view.bounds), CGRectGetWidth(self.view.bounds), CGRectGetHeight(self.view.bounds));

// Add the new controller
[self.view addSubview:newVC.view];

// Store a reference to the current controller
self.currentViewController = newVC;
}
}

- (IBAction)indexDidChangeForSegmentedControl:(UISegmentedControl *)sender {

NSUInteger index = sender.selectedSegmentIndex;

if (UISegmentedControlNoSegment != index) {
UIViewController *incomingViewController = [self.allViewControllers objectAtIndex:index];
[self switchToController:incomingViewController];
}

}

关于ios - 分段控制更改时更改 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11422845/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com