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
包含一个 NSTextView
和 NSButton
。单击按钮时,我希望父控制器(拥有 targetPopover
的视图控制器)根据 targetViews textView 的内容执行操作,然后关闭弹出窗口。
我可以想到三种方法。
在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
使用委托而不是 createAndShowPopover
添加:
targetController.restoreDelegate = self;
并将前一个块中的代码添加到委托方法中。
我想我更喜欢方法 #2(委托),因为它看起来更整洁。我的总体问题是,是否有首选样式?我完全没有达到目标吗?
请注意,在我的具体情况下,这是针对 mac 开发的,但我相信相同的概念将适用于 iOS 和 uipopovercontroller
。
我同意方法 #2 一直对我有用。尽管做一个或另一个没有任何压倒性的计算优势。如果您决定添加更多功能,#2 更清晰且更易于编辑。加油吧。
假设我有一个 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
包含一个 NSTextView
和 NSButton
。单击按钮时,我希望父控制器(拥有 targetPopover
的视图控制器)根据 targetViews textView 的内容执行操作,然后关闭弹出窗口。
我可以想到三种方法。
在
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
使用委托而不是
createAndShowPopover
添加:targetController.restoreDelegate = self;
并将前一个块中的代码添加到委托方法中。
我想我更喜欢方法 #2(委托),因为它看起来更整洁。我的总体问题是,是否有首选样式?我完全没有达到目标吗?
请注意,在我的具体情况下,这是针对 mac 开发的,但我相信相同的概念将适用于 iOS 和 uipopovercontroller
。
我同意方法 #2 一直对我有用。尽管做一个或另一个没有任何压倒性的计算优势。如果您决定添加更多功能,#2 更清晰且更易于编辑。加油吧。