【问题标题】:Switching Between Views with a UISegmentedControl使用 UISegmentedControl 在视图之间切换
【发布时间】:2015-09-23 13:35:41
【问题描述】:

从标题中可以清楚地看出,我正在尝试找到一种使用分段控制在视图之间切换的方法。实际上,我已经得到了一些东西并且它正在工作。您可以在下面找到它:

- (IBAction)segmentChanged:(id)sender{
    UISegmentedControl *segmentedControl = sender;
    switch (segmentedControl.selectedSegmentIndex) {
        case 0:
            self.currencyContainer.hidden = NO;
            self.goldContainer.hidden = YES;
            self.alarmContainer.hidden = YES;
            break;
        case 1:
            self.currencyContainer.hidden = YES;
            self.goldContainer.hidden = NO;
            self.alarmContainer.hidden = YES;
            break;
        case 2:
            self.currencyContainer.hidden = YES;
            self.goldContainer.hidden = YES;
            self.alarmContainer.hidden = NO;
            break;
        default:
            break;
    }
}

因此,它取决于隐藏和可见的原理。我认为它使用起来很常见,因为我从互联网上搜索过,通常人们都以这种方式获得解决方案。但是,我希望它略有不同。使用我的代码,一次加载所有视图,但我想在只有视图出现在屏幕上时加载。如果我从 0 切换到 1 索引段,那么我想加载第一个视图并显示在屏幕上。

我该如何管理它?

谢谢。

【问题讨论】:

  • 所以为什么不尝试在所选的seconment时替换在视图上的子控制器? [自我选择控制器:您的控制器类];在那里你可以删除可见的控制器并加载新的
  • 我已经更新了我的答案,并附上了我制作的关于如何使用 UISegmentedControl 执行此操作的教程的链接。检查我的答案。

标签: ios objective-c uisegmentedcontrol


【解决方案1】:

我在这里回答了一个类似(不一样,但结果相似)的问题:How To Switch Views With NSNotifications

基本上你可以使用 NSNotifications 切换视图。您的第一个视图将加载并使用 NSNotifications 您可以向自定义类发送通知,该类通过更改视图进行侦听和响应;当您在 UISegmentControl 上选择索引时,您的视图会发生变化。

在您的代码中,在您的 NSObject 类 ButtonHandler 中看起来像这样:

- (IBAction)segmentChanged:(id)sender{
    UISegmentedControl *segmentedControl = sender;
    switch (segmentedControl.selectedSegmentIndex) {
        case 0:
            [[NSNotificationCenter defaultCenter] postNotificationName:@"notifyButtonPressed1" object:self];
        break;
        case 1:
            [[NSNotificationCenter defaultCenter] postNotificationName:@"notifyButtonPressed2" object:self];
        break;
        case 2:
            [[NSNotificationCenter defaultCenter] postNotificationName:@"notifyButtonPressed3" object:self];
        break;
        default:
        break;
    }
}

然后只需按照我在另一篇文章中列出的其余代码进行操作即可。

这是效果:

更新

我在这个链接上创建了一个关于如何做到这一点的教程:iOS Custom Navigation with UISegmentedControl

要将视图设置为与设备绑定的相同,请使用以下命令:

//this will get the size of your device view 
//and set it to width and height aka w & h
int w = self.view.frame.size.width;
int h = self.view.frame.size.height;

//THIS SETS THE SIZE AND POSITION OF THE NEW CONTENT
self.content.view.frame = CGRectMake(0, 0, w, h);

【讨论】:

  • 我一直在想办法。因此,当段索引更改时,通知将发送到正确的类。通知。将通过 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeView1:) name:@"notifyButtonPressed1" object:nil] 发送; .此外,视图类必须有一个方法,例如您的 handleButton 方法。都这样吗?
  • @KutayDemireren 是的。 NSNotificationCentre 使用动作和监听器来执行功能。因此,您为每个调用创建一个函数,或者在您的情况下,您可以只使用一种方法与您的 case 1: case 2: etc
  • @KutayDemireren 看到我更新的答案。另外,Bhutan 的答案是 swift,而不是 Obj-C,我相信你可能知道。
  • 好吧,我还没有尝试,但我会尽快尝试您的最后建议。那个教程看起来很棒。非常感谢!不能对任何人寄予太多期望。
  • @KutayDemireren 如果您需要将视图设置为适合屏幕,请在答案中使用更新的代码。感谢您的接受和投票,非常感谢。
【解决方案2】:

您可以通过使用Lazy Stored Properties 来实现这一点:

lazy var currencyContainer:UIView = {
     var newCurrencyContainer = UIView()
     // your initialization code
     return newCurrencyContainer
}()

惰性存储属性是在第一次使用时才计算初始值的属性。 - Apple Docs

通过使用像这样的可选变量:

var goldContainer:UIView?

后来检查

if let goldContainer = goldContainer {
     // view is already created
} else {
     // your custom init
     // goldContainer = UIView()
}

希望对你有所帮助。

【讨论】:

  • 所以你建议我把 if 语句放在我已经拥有的每一个 if 里面,对吗?
  • 我不知道您的完整代码以及您使用了多少次 if 语句。我刚刚向您展示了这些方法可能会对您有所帮助。关于您的查询,如果您确信您的可选变量包含一个非零值,您可以使用 ! 强制解包它的值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-22
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2011-07-13
  • 2012-05-15
相关资源
最近更新 更多