【问题标题】:UIView inheritance for multiple UIView in iOSiOS中多个UIView的UIView继承
【发布时间】:2015-03-06 01:56:36
【问题描述】:

我正在尝试构建一个简单的 iOS 应用程序,该应用程序将简单地掷骰子以不同的面数(d20、d12 等...)

我想创建一个视图,我将在同一个 UIViewController 中重复使用多次,如下所示:http://cl.ly/image/2s30353F3V1K(唯一改变的是边数)

我想不通的是如何正确地在情节提要中创建 UI 元素,而不是简单地为每个不同数量的面复制和粘贴 ContainerView 的嵌入对象。

有没有一种简单的方法可以正确地对其进行子类化?我是 iOS 故事板的新手,正在尝试使用 OO 原则。

【问题讨论】:

  • 这看起来是使用 UITableView 的完美场景。
  • 为什么不让您的模具视图控制器足够智能以处理任何所需数量的面?这样,您在实例化时告诉它有多少边,并且 它 配置它自己的接口。

标签: ios swift uiview uiviewcontroller storyboard


【解决方案1】:

所以你有一个DieViewController,但你需要不同的实例有不同的边数。

@interface DieViewController
…
@property (nonatomic) NSInteger numberOfSides;
…
@end

问题是如何将正确数量的边传达给每个包含的实例。这就是嵌入转场的用武之地。在故事板中,将故事板嵌入转场标识符设置为唯一的(我将使用6SidedDie)。最后,在ViewController 中添加-prepareForSegue:sender:

@@implementation ViewController
…
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"6SidedDie"]) {
        DieViewController *dieViewController = segue.destinationViewController;
        dieViewController.numberOfSides = 6;
    }
}
…
@end

当然,您可以将其混合使用以产生大量骰子。这是可以处理标识符6SidedDie 和10SidedDie 的代码。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier hasSuffix:@"Die"]) {
        DieViewController *dieViewController = segue.destinationViewController;

        if ([segue.identifier hasPrefix:@"6Sided"]) {
            dieViewController.numberOfSides = 6;
        } else if ([segue.identifier hasPrefix:@"10Sided"]) {
            dieViewController.numberOfSides = 10;
        }
    }
}

更新

您可以使用self.viewControllers 数组访问DieViewController 实例中的内容。

DieViewController *dieViewController = self.viewControllers[0]; // The first die view controller

if (dieViewController.numberOfSides == 6) {
    // This is the six sided die.
}

注意:self.viewControllers 不会被订购。您需要查看numberOfSides 以查看这是哪种类型的模具。

【讨论】:

  • 这完全有道理。但是如何将控件绑定到 DieViewController?在我链接到的图像中,我有 4 个容器视图,它们都链接到具有 4 个对象(2 个标签、按钮和步进器)的同一个 UIView。如何将这 4 个对象绑定到视图控制器?
  • 循环遍历很有意义,谢谢。然后我是否需要在 CODE 中手动绑定对象而不是在情节提要上进行绑定?
【解决方案2】:

我不清楚你的问题,但我有一个想法

首先,你得到一个 UIViewController 的瞬间

YourViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"Identifier"];
[vc methodToChangeTheSideProperty:(NSString *)side];
CGRect frame = vc.view.frame;
//change frame of the view as you want
...
...
vc.view.frame = frame;

然后,将控制器的视图添加到要显示的容器中

[yourViewContainer addSubview:vc.view];

【讨论】:

  • 我认为必须手动连接标签、步进器和按钮的绑定吗?
  • 您只需要创建一次DieViewController。使用上面的代码创建您需要的即时数量,然后调用methodToChangeTheSideProperty 更改标签中的文本。
猜你喜欢
  • 1970-01-01
  • 2018-07-30
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 2014-08-26
  • 2022-11-19
  • 2023-03-16
  • 1970-01-01
相关资源
最近更新 更多