我正在尝试子类化Element* ePtr = elementPointersPointer->at(0);
并让IT负责确定要创建和呈现什么类型的UIViewController(contentViewController)而不是可怕的混乱使用该责任的popover的调用代码。但是我遇到了几个问题。
根据Apple文档,在第一次打电话之前,从来没有正当理由做任何事情。
std::vector<Element> elements;
std::vector<Element>& elementsRef = elements;
所以我试过这个,以为我可以在我的代码检查我传入的数据时决定稍后在方法中设置UIPopoverController
属性,并决定要创建哪个UIViewController和prsent,但调用{{ 1}}出现错误,告诉我必须调用另一个初始化程序。
if (self = [super init])
所以我的问题如下图所示。我不能使用我的自定义初始化程序的第一行来做出决定,然后当对super的调用应该是第一次调用时,然后调用super,并且根据apple,没有充分的理由不让它成为第一个调用
contentViewController
怎么办? 感谢。
答案 0 :(得分:2)
来自UIPopoverController
上的Apple documentation:
初始化此类的实例时,必须指定提供弹出窗口内容的视图控制器。
UIPopoverController
没有任何内容,它需要另一个UIViewController
来呈现您真正想要呈现的内容。 UIViewController
的任何子类都足够了,只要它不与弹出控制器冲突。
例如,您可以使用Storyboard
或XIB
中的自定义设计控制器,或以编程方式实例化的UIViewController
。但是,你不仅限于这两个。子类化UIPopoverController
无济于事,因为子类仍然需要内容控制器。
现在,继承UIPopoverController
并实现在该类中创建内容控制器的逻辑,违反了Single Responsibility Principle,因为您将混合使用popover类的职责。目前UIPopoverController
有一个很好的责任 - 在弹出窗口中显示视图控制器,如果你还要负责创建内容控制器,那么你只会给它带来负担。
我的建议是创建一个MyPopoverFactory
类,其中包含将创建popover及其内容控制器的方法。例如:
- (UIPopoverController*)popoverForSomething
答案 1 :(得分:1)
我不知道,这是否有帮助,因为我真的不明白,你必须做出什么决定。但是你可以在这种情况下使用的一般模式(类似于类集群)就是拥有另一个创建者。 (你也可以用-init…
做到这一点,但这很不方便。如果你需要,请告诉我。)
+ (instancetype)myPopUpControllerForData:(id)data
{
// make the decision on data
Class contentViewControllerType;
contenViweControllerType = …;
// After that create the instance of the content view controller
contentViewController = [[ContentViewControllerType alloc] init…];
// init… is the first message after alloction
self = [[self alloc] initWithContentViewController:contentViewController];
return self;
}
文档仅要求-init…
是分配实例的第一条消息。这并不意味着您失去了运行与该实例相关的 代码的自由。