当前位置: 首页 > 知识库问答 >
问题:

如何为多个子类使用单个故事板uiView控制器

孟俊晖
2023-03-14

假设我有一个故事板,其中包含UINavigationController作为初始视图控制器。它的根视图控制器是UITableViewController的子类,即BasicViewController。它有iAction,它连接到导航栏的右导航按钮

从那里我想将情节提要用作其他视图的模板,而无需创建其他情节提要。假设这些视图将具有完全相同的界面,但具有类SpecificViewController1SpecificViewController2的根视图控制器,它们是BasicViewController的子类
除了iAction方法外,这两个视图控制器将具有相同的功能和界面
如下所示:

@interface BasicViewController : UITableViewController

@interface SpecificViewController1 : BasicViewController

@interface SpecificViewController2 : BasicViewController

我能做那样的事吗?
我可以只是实例化故事板的BasicViewController,但有根视图控制器子类SpecificViewControlller1SpecificViewControlller2

谢谢。

共有3个答案

唐向荣
2023-03-14

正如公认的答案所说,似乎不可能使用故事板。

我的解决方案是使用Nib——就像开发人员在故事板之前使用它们一样。如果您想要一个可重用的、可子类化的视图控制器(甚至是视图),我的建议是使用Nibs。

SubclassMyViewController *myViewController = [[SubclassMyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 

将所有插座连接到MyViewController中的“文件所有者”时。xib您没有指定Nib应作为什么类加载,您只是指定键值对:“此视图应连接到此实例变量名。”调用[SubclassMyViewController alloc]initWithNibName:时,初始化过程指定将使用哪个视图控制器“控制”您在nib中创建的视图。

吕鹏
2023-03-14

我们要找的线路代码是:

object_setClass(AnyObject!, AnyClass!)

在故事板-

class ParentVC: UIViewController {

    var type: Int?

    override func awakeFromNib() {

        if type = 0 {

            object_setClass(self, ChildVC1.self)
        }
        if type = 1 {

            object_setClass(self, ChildVC2.self)
        }  
    }

    override func viewDidLoad() {   }
}

class ChildVC1: ParentVC {

    override func viewDidLoad() {
        super.viewDidLoad()

        println(type)
        // Console prints out 0
    }
}

class ChildVC2: ParentVC {

    override func viewDidLoad() {
        super.viewDidLoad()

        println(type)
        // Console prints out 1
    }
}
郭麒
2023-03-14

很好的问题-但不幸的是只有一个蹩脚的答案。我不相信它是目前可能做你的建议,因为有没有在UIStoryboard初始化允许覆盖视图控制器与故事板相关的定义在初始化的故事板中的对象详细信息。在初始化时,滑板中的所有UI元素都链接到视图控制器中的属性。

默认情况下,它将使用序列图像板定义中指定的视图控制器进行初始化。

如果您试图重用在情节提要中创建的UI元素,则它们仍然必须链接或关联到视图控制器正在使用它们的属性,以便能够“告诉”视图控制器有关事件的信息。

在故事板布局上进行复制并不是什么大问题,特别是如果您只需要3个视图的类似设计,但是如果需要,则必须确保清除所有以前的关联,否则在尝试与以前的视图控制器通信时会崩溃。您将能够在日志输出中将它们识别为KVO错误消息。

您可以采取以下几种方法:

>

  • 将UI元素存储在UIView中—存储在xib文件中,并从基类实例化它,然后将其作为子视图添加到主视图中,通常为self。看法然后,您可以简单地使用故事板布局,其中基本上是空白的视图控制器保留其在故事板中的位置,但为其指定了正确的视图控制器子类。因为它们将从基继承,所以它们将获得该视图。

    在代码中创建布局并从基本视图控制器安装。显然,这种方法违背了使用故事板的目的,但在您的情况下,这可能是一种方法。如果应用程序的其他部分可以从故事板方法中受益,那么在适当的情况下可以在这里和那里有所不同。在这种情况下,与上面一样,您只需在分配子类的情况下使用银行视图控制器,并让基本视图控制器安装UI。

    如果苹果想出一种方法来实现你的提议,那就太好了,但是让图形元素与控制器子类预链接的问题仍然是一个问题。

    祝你新年快乐!!安好

  •  类似资料:
    • 我被一个问题困住了,我在官方留档、Stackoverflow或谷歌上找不到答案。 我是一名经验丰富的iOS开发人员,但不熟悉故事板。我想在当前viewcontroller上实例化一个视图,在NIB中,我将在viewcontroller外部绘制一个视图,并附加一个出口以在代码中引用它,并调用addSubview:之类的东西。在MapView委托中绘制覆盖图或详图索引视图非常有用。但我不知道如何在故事

    • 我已经通读了《iOS View Controller编程指南》和《iOS View编程指南》,如果代码或情节提要中没有大量复制,我无法找到执行以下操作的最佳方法。 我正在为我的孩子们编写一个简单的数学教程程序,其中有一个带有数字“NumberPad”(数字0-9)的视图,以及一些动画的场景。 到目前为止,我有一个视图控制器,它处理简单的加减乘除问题,工作良好。 我想为一个视图控制器使用相同的数字键

    • 我正在开发一个游戏,其中第一个视图控制器将包含30个视图控制器的其余部分的全部功能,其中这些控制器的其余部分将是第一个视图控制器的子部分。我的计划是为我的应用程序中的所有30个视图控制器或场景使用单个故事板,它们都将使用相同的背景图像。为了让你知道我在说什么,我在这幅画中只展示了两个场景。故事板图像,但计划是有28更多的场景在这个相同的故事板。绘图。故事板 如果此故事板中的所有30个场景都具有相同

    • 我在情节提要中建立了一些视图控制器,就像下面的图片 我已经实现了它们内部的数据,modal segue用于它们之间的转换。现在我才意识到,当我按“后退”按钮时,以前的视图将无法正确加载。我想我应该切换到导航控制器,并将这些控制器添加到堆栈中。但我不知道如何从我现在的位置走下去。 我认为我应该以编程方式进行更改,因为我发现在情节提要中构建导航控制器在UI设计上不会有太大的变化(至少我不知道如何以那种

    • 一些代码: 这里,我从kinesis流中获取数据,并将其序列化到我的数据类中。一切正常,但现在需要增加以另一种格式接收数据的能力(例如,DataClassSecond) 其中一个选项是,添加一个额外的数据源并在您自己的流中处理它们。 但是这需要一个额外的运动队列。我不确定这是否是一个好方法有没有什么方法可以从运动接收不同的数据,然后根据类型分割流?

    • 有没有办法将原型单元连接到不同的场景,并在didSelectRowAtIndexPath方法上调用[自我执行的guewithidentifier:@“name of seue”发送方:self]?我似乎无法将多个片段从原型单元拖到不同的场景。。。我知道使用静态单元格是可能的,因为你可以从每个单元格到场景绘制一段,但如果我使用的是原型单元格呢? 我目前正在尝试使用SWRevealViewContro