【问题标题】:Can't switch between 2 view controller's with a Segmented Control无法在带有分段控件的 2 个视图控制器之间切换
【发布时间】:2014-01-22 01:58:58
【问题描述】:

我在 UIViewController 的导航栏中以编程方式创建了一个 UISegmentedControl,我希望能够在切换分段控件时切换视图控制器。

这是我目前所拥有的:

 @interface TVExploreViewController : TVViewController

    @property (nonatomic, strong) UISegmentedControl *scopeControl;
    @property (nonatomic, assign) NSInteger scope;
    @property (nonatomic, strong) UIViewController *premiumContentViewController;
    @property (nonatomic, strong) UIViewController *trendingContentViewController;
    @property (nonatomic, strong) UIViewController *currentViewController;

 @end

TVExploreViewController 的实现:

- (void)viewDidLoad {
      [super viewDidLoad];
      _scopeControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"TV & MOVIES", @"VIRAL CLIPS", nil]];
      [_scopeControl setFrame:CGRectMake(80, 0, 200, 30)];
      [_scopeControl addTarget:self
                     action:@selector(scopeChanged:)
                     forControlEvents:UIControlEventValueChanged];
      [[self navigationItem] setTitleView:_scopeControl];
      [_scopeControl setSelectedSegmentIndex:0];

      _premiumContentViewController = [[TVPremiumContentViewController alloc] init];
      _trendingContentViewController = [[TVTrendingFeedController alloc] init];
      [self setScope:0];
}

- (void)scopeChanged:(id)sender {
    [self setScope:self.scopeControl.selectedSegmentIndex];
}

- (void)transitionToViewController:(UIViewController *)controller
{
    [self.currentViewController willMoveToParentViewController:nil];
    if (controller) {
        [self addChildViewController:controller];
    }

    controller.view.frame = self.view.bounds;
    [self.view addSubview:controller.view];
    [self.currentViewController.view removeFromSuperview];
    [self.currentViewController removeFromParentViewController];
    [controller didMoveToParentViewController:self];
    self.currentViewController = controller;
}

- (void)setScope:(NSInteger)scope {
    if (scope != _scope) {
        _scope = scope;
        UIViewController *nextController = nil;

        if (_scope == 0) {
            nextController = self.premiumContentViewController;
        } else if (_scope == 1) {
            nextController = self.trendingContentViewController;
        }
        [self transitionToViewController:nextController];
    }
}

当我在 TVExploreViewController 中切换分段控件时,视图的其余部分保持白色,并且没有加载视图控制器。有谁知道我做错了什么?

【问题讨论】:

  • 当用户更改分段控件中选定的段时,应该调用什么代码?您需要一个连接到分段控件的 UIControlEventValueChanged 事件的 IBAction,并且您根本没有显示任何 IBAction 代码。
  • 我在 viewDidLoad 中有这个:[_scopeControl addTarget:self action:@selector(scopeChanged:) forControlEvents:UIControlEventValueChanged];
  • @DuncanC 您不必使用界面生成器来创建控件...
  • @John 没错,但您确实需要一个与之连接的操作方法。哦,现在我明白了。他的代码可以手动添加分段控件,并使用方法 scopeChanged: 添加目标/操作。当我没有看到 IBAction 时,我停止了查找。我的错。
  • 我不得不不同意上面的评论——遵循 Cocoa 命名约定应该足以理解正在执行哪些操作来调用该方法,而 IBAction 只是让您知道哪些方法的编译器糖由 IB 自动处理。但这不是讨论的地方,所以我现在正在使用 iPhone。

标签: ios objective-c cocoa-touch uisegmentedcontrol


【解决方案1】:

这不是一个答案,但是在这里写一些日志代码很方便。

你能告诉我方法中的日志吗?

- (void)transitionToViewController:(UIViewController *)controller
{
    [self.currentViewController willMoveToParentViewController:nil];
    if (controller) {
        [self addChildViewController:controller];
    }

    controller.view.frame = self.view.bounds;
    [self.view addSubview:controller.view];
    [self.currentViewController.view removeFromSuperview];
    [self.currentViewController removeFromParentViewController];
    [controller didMoveToParentViewController:self];
    self.currentViewController = controller;

    // can you show me the log here ?
    NSLog(@"%@, %@, %@", controller.view, controller.view.superview, self.view) ;
    // you should see the subviews that you added.
    NSLog(@"subviews:%@", [controller.view subviews]) ;
}

【讨论】:

  • >, >, >
  • @thisiscrazy4 controller.view 被添加到层次结构中。看来问题出在 TVTrendingFeedController 或 TVTrendingFeedController。
  • 知道可能是什么问题吗?如果我单独加载它们,它们似乎工作正常。
  • @thisiscrazy4 我不确定。你如何配置TVTrendingFeedControllerTVPremiumContentViewController? xib 或在viewDidLoad 中手动添加控件。
  • 我刚刚注意到的一件事..如果我将 TVExploreViewController 的 self.view 的背景颜色设置为某种非白色,它仍然是白色的。这正常吗?
【解决方案2】:

将 ViewControllers 添加到 ViewController 中确实不是一个好主意,您应该始终在屏幕上拥有一个 ViewController。您可以使用 NavigationController 执行此操作,无需动画即可推送。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    相关资源
    最近更新 更多