如果你不能先调用[super init]怎么办?

时间:2015-05-13 05:57:07

标签: ios objective-c uipopovercontroller

我正在尝试子类化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

怎么办? 感谢。

2 个答案:

答案 0 :(得分:2)

来自UIPopoverController上的Apple documentation

  

初始化此类的实例时,必须指定提供弹出窗口内容的视图控制器。

UIPopoverController没有任何内容,它需要另一个UIViewController来呈现您真正想要呈现的内容。 UIViewController的任何子类都足够了,只要它不与弹出控制器冲突。

例如,您可以使用StoryboardXIB中的自定义设计控制器,或以编程方式实例化的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…是分配实例的第一条消息。这并不意味着您失去了运行与该实例相关的 代码的自由。