gpt4 book ai didi

iphone - UISegmentedControl 最佳实践

转载 作者:行者123 更新时间:2023-12-03 18:18:47 25 4
gpt4 key购买 nike

我正在尝试找出在 iPhone 应用程序中使用 UISegmentedControl 的“最佳”方法。我已经在 stackoverflow 上阅读了一些帖子,并看到了一些人的想法,但我无法完全找出做到这一点的最佳方法。我引用的帖子是:

Changing Views from UISegmentedControlHow do I use a UISegmentedControl to switch views?

选项似乎是:

  • 在 IB 中添加每个 View 并将它们彼此重叠放置,然后显示/隐藏它们
  • 在 IB 中单独创建每个 subview ,然后在主视图中创建一个容器以填充您需要的 subview
  • 设置一个非常高或非常宽的UIView,并根据所选片段向左/向右或向上/向下设置动画
  • 使用 UITabBarController 交换 subview - 看起来很愚蠢
  • 对于表格,重新加载表格并在 cellForRowAtIndex 中,根据所选的分段选项从不同的数据源或部分填充表格(我的应用的情况并非如此)

那么哪种方法最适合 subview /非表方法?哪个最容易实现?您能否分享一些该方法的示例代码?

谢谢!

最佳答案

我在 iPad 应用程序中也遇到过这个要求。

我想到的解决方案是创建专门的 View Controller 每种样式的 View 处理与这些 View 相关的业务逻辑(即与每个段相关),并以编程方式添加/删除它们响应所选段的“管理” Controller 的 subview 索引变化。

为此,必须创建一个额外的 UIViewController 子类来管理UISegmentedControl 更改,并添加/删除 subview 。

下面的代码完成了这一切,还考虑了一些注意事项/额外的内容:

  • viewWillAppear/viewWillDisappear/etc,不会在 subview 上调用自动,并且需要通过“管理” Controller 告知
  • viewWillAppear/viewWillDisappear/etc,不会在“管理”时调用 Controller 位于导航 Controller 内时,因此导航 Controller 委托(delegate)
  • 如果您想从内部推送到导航堆栈分割的 subview ,您需要回调到“管理” View 这样做,因为 subview 是在外部创建的导航层次结构,并且不会引用导航 Controller 。
  • 如果在导航 Controller 场景中使用,则后退按钮为自动设置为段的名称。

界面:

@interface SegmentManagingViewController : UIViewController <UINavigationControllerDelegate> {
UISegmentedControl * segmentedControl;
UIViewController * activeViewController;
NSArray * segmentedViewControllers;
}

@property (nonatomic, retain) IBOutlet UISegmentedControl * segmentedControl;
@property (nonatomic, retain) UIViewController * activeViewController;
@property (nonatomic, retain) NSArray * segmentedViewControllers;

@end

实现:

@interface SegmentManagingViewController ()
- (void)didChangeSegmentControl:(UISegmentedControl *)control;
@end

@implementation SegmentManagingViewController

@synthesize segmentedControl, activeViewController, segmentedViewControllers;

- (void)viewDidLoad {
[super viewDidLoad];

UIViewController * controller1 = [[MyViewController1 alloc] initWithParentViewController:self];
UIViewController * controller2 = [[MyViewController2 alloc] initWithParentViewController:self];
UIViewController * controller3 = [[MyViewController3 alloc] initWithParentViewController:self];

self.segmentedViewControllers = [NSArray arrayWithObjects:controller1, controller2, controller3, nil];
[controller1 release];
[controller2 release];
[controller3 release];

self.navigationItem.titleView = self.segmentedControl =
[[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"Seg 1", @"Seg 2", @"Seg 3", nil]];
self.segmentedControl.selectedSegmentIndex = 0;
self.segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;

[self.segmentedControl addTarget:self action:@selector(didChangeSegmentControl:) forControlEvents:UIControlEventValueChanged];

[self didChangeSegmentControl:self.segmentedControl]; // kick everything off
}

- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.activeViewController viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self.activeViewController viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[self.activeViewController viewWillDisappear:animated];
}

- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
[self.activeViewController viewDidDisappear:animated];
}

#pragma mark -
#pragma mark UINavigationControllerDelegate control

// Required to ensure we call viewDidAppear/viewWillAppear on ourselves (and the active view controller)
// inside of a navigation stack, since viewDidAppear/willAppear insn't invoked automatically. Without this
// selected table views don't know when to de-highlight the selected row.

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
[viewController viewDidAppear:animated];
}

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
[viewController viewWillAppear:animated];
}

#pragma mark -
#pragma mark Segment control

- (void)didChangeSegmentControl:(UISegmentedControl *)control {
if (self.activeViewController) {
[self.activeViewController viewWillDisappear:NO];
[self.activeViewController.view removeFromSuperview];
[self.activeViewController viewDidDisappear:NO];
}

self.activeViewController = [self.segmentedViewControllers objectAtIndex:control.selectedSegmentIndex];

[self.activeViewController viewWillAppear:NO];
[self.view addSubview:self.activeViewController.view];
[self.activeViewController viewDidAppear:NO];

NSString * segmentTitle = [control titleForSegmentAtIndex:control.selectedSegmentIndex];
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:segmentTitle style:UIBarButtonItemStylePlain target:nil action:nil];
}

#pragma mark -
#pragma mark Memory management

- (void)dealloc {
self.segmentedControl = nil;
self.segmentedViewControllers = nil;
self.activeViewController = nil;
[super dealloc];
}

@end

希望这有帮助。

关于iphone - UISegmentedControl 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2118358/

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