【发布时间】: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 包含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;[strongSelf.textView setString: textToRestore]; [strongSelf.targetPopover close];}; // Set our string
-
使用委托而不是
createAndShowPopover添加:targetController.restoreDelegate = self;
并将前一个块中的代码添加到委托方法中。
我认为我更喜欢方法#2(委托),因为它看起来更整洁。我的总体问题是,是否有首选风格?我是否完全错过了目标?
请注意,在我的具体情况下,这是针对 mac 开发的,但我相信同样的概念也适用于 iOS 和 uipopovercontroller。
【问题讨论】:
标签: objective-c delegates objective-c-blocks