【问题标题】:NSPopover view controller - Communicate with parent via block or delegate?NSPopover 视图控制器 - 通过块或委托与父级通信?
【发布时间】:2015-10-14 20:09:21
【问题描述】:

假设我有一个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;
    
    
    [strongSelf.textView setString: textToRestore];
    [strongSelf.targetPopover close];
    

    }; // Set our string

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

    targetController.restoreDelegate = self;

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

我认为我更喜欢方法#2(委托),因为它看起来更整洁。我的总体问题是,是否有首选风格?我是否完全错过了目标?

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

【问题讨论】:

    标签: objective-c delegates objective-c-blocks


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-28
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-22
      相关资源
      最近更新 更多