NSPopover 视图控制器 - 通过块或委托与父级通信?

NSPopover view controller - Communicate with parent via block or delegate?

假设我有一个 NSViewController,它将使用类似于此的内容显示在弹出窗口中:

- (void) createAndShowPopover
{
    TargetViewController * targetViewContoller = [[TargetViewController alloc] init];

    NSPopover * targetPopover = [[NSPopover alloc] init];
    targetPopover.contentViewController      = targetViewContoller;
    targetPopover.delegate                   = self;

    [targetPopover setAppearance: NSPopoverAppearanceMinimal];
    [targetPopover setAnimates: NO];
    [targetPopover setBehavior: NSPopoverBehaviorTransient];

    [targetPopover showRelativeToRect: ...];
}

现在 TargetViewContoller 包含一个 NSTextViewNSButton。单击按钮时,我希望父控制器(拥有 targetPopover 的视图控制器)根据 targetViews textView 的内容执行操作,然后关闭弹出窗口。

我可以想到三种方法。

  1. targetViewController上的一个块属性比如typedef void (^TextRestoreBlock) (NSString * textToRestore);并且在createAndShowPopover代码中添加如下代码:

    __unsafe_unretained typeof(self) weakSelf = self;
    targetController.restoreBlock =
    ^(NSString * textToRestore)
    {
        // Establish the strong self reference
        __strong typeof(self) strongSelf = weakSelf;</p>
    
    <pre><code>[strongSelf.textView setString: textToRestore];
    [strongSelf.targetPopover close];
    

    }; // Set our string

  2. 使用委托而不是 createAndShowPopover 添加:

    targetController.restoreDelegate = self;
    

并将前一个块中的代码添加到委托方法中。

我想我更喜欢方法 #2(委托),因为它看起来更整洁。我的总体问题是,是否有首选样式?我完全没有达到目标吗?

请注意,在我的具体情况下,这是针对 mac 开发的,但我相信相同的概念将适用于 iOS 和 uipopovercontroller

我同意方法 #2 一直对我有用。尽管做一个或另一个没有任何压倒性的计算优势。如果您决定添加更多功能,#2 更清晰且更易于编辑。加油吧。