objective-c – 在全屏模式下连接到NSView的NSView上的NSControl
设置:
>我的应用程序具有使用enterFullScreenMode:withOptions:设置为全屏模式的后台视图. 整个设置要复杂得多,这使得在此处发布代码变得非常困难.不过,如果您要求,我会添加一些部分. 问题: 编辑1: 编辑2: // PreferencesViewController.h #import <Cocoa/Cocoa.h> #import "SlideShowModelProtocol.h" #import "DisplayInfoController.h" @interface PreferencesViewController : NSViewController { id<SlideShowModelProtocol> m_localModel; DisplayInfoController* m_displayInfoController; } @property (readonly) id<SlideShowModelProtocol> localModel; @property (readwrite,assign) IBOutlet DisplayInfoController* displayInfoController; - (void)moveViewToSuperview:(NSView*)superview; - (void)showOnView:(NSView*)superview; - (void)removeViewFromSuperview; - (BOOL)viewHasSuperview; - (void)updateModelSettings; - (IBAction)cancelView:(id)sender; - (IBAction)confirmView:(id)sender; @end …和实现PreferencesViewController.m: // PreferencesViewController.m #import "PreferencesViewController.h" #import "ApplicationController.h" #import "DisplayInfo.h" @interface PreferencesViewController() - (void)centerViewOnSuperview; - (void)loadModel; @end @implementation PreferencesViewController - (id)init { self = [super initWithNibName:@"PreferencesView" bundle:nil]; if (self != nil) { m_localModel = nil; m_displayInfoController = nil; // Assigned in Interface Builder. } return self; } @synthesize localModel = m_localModel; @synthesize displayInfoController = m_displayInfoController; - (void)loadModel { [self willChangeValueForKey:@"localModel"]; // Retrieve deep copy of the model. m_localModel = [[[ApplicationController sharedController] model] copyWithZone:nil]; // Reset the table view selection as saved in the model. NSIndexSet* selectionIndices = [NSIndexSet indexSetWithIndex:[[m_localModel selectedScreenIndex] unsignedIntegerValue]]; [[m_displayInfoController displayInfoTableView] selectRowIndexes:selectionIndices byExtendingSelection:NO]; [self didChangeValueForKey:@"localModel"]; } /** Moves and positions the view on the given superview (aka another screen). @param superview A superview. */ - (void)showOnView:(NSView*)superview { [self moveViewToSuperview:superview]; [self centerViewOnSuperview]; } /** Moves the view on the given superview. @param superview A superview (In full screen mode a background view). */ - (void)moveViewToSuperview:(NSView*)superview { if ([[self view] superview] == superview) { return; } [self loadModel]; [[self view] removeFromSuperview]; [superview addSubview:[self view]]; } - (void)removeViewFromSuperview { [[self view] removeFromSuperview]; } - (void)centerViewOnSuperview { NSRect superviewFrame = self.view.superview.frame; NSRect viewFrame = self.view.frame; float viewFrameWidth = viewFrame.size.width; float viewFrameHeight = viewFrame.size.height; float xPos = 0.5f * superviewFrame.size.width - 0.5f * viewFrameWidth; float yPos = 0.5f * superviewFrame.size.height - 0.5f * viewFrameHeight; NSRect frame = NSMakeRect(xPos,yPos,viewFrameWidth,viewFrameHeight); [self.view setFrame:frame]; } - (BOOL)viewHasSuperview { return [[self view] superview] != nil; } - (void)updateModelSettings { id<SlideShowModelProtocol> globalModel = [[ApplicationController sharedController] model]; [globalModel setFadeDuration:[m_localModel fadeDuration]]; [globalModel setStayDuration:[m_localModel stayDuration]]; [globalModel setStartWithFirst:[m_localModel startWithFirst]]; [globalModel setSortingMode:[m_localModel sortingMode]]; [globalModel setAnimationIsActive:[m_localModel animationIsActive]]; [globalModel setSelectedScreenIndex:[m_localModel selectedScreenIndex]]; [globalModel setPanAmount:[m_localModel panAmount]]; [globalModel setZoomAmount:[m_localModel zoomAmount]]; [globalModel setZoomFactor:[m_localModel zoomFactor]]; } #pragma mark - #pragma mark UserInterface - (IBAction)cancelView:(id)sender { [[ApplicationController sharedController] hidePreferencesViewModelSettingsUpdated:NO]; } - (IBAction)confirmView:(id)sender { ApplicationController* applicationController = [ApplicationController sharedController]; if ([[applicationController model] isEqualToModel:m_localModel]) { [self cancelView:sender]; return; } [self updateModelSettings]; [applicationController hidePreferencesViewModelSettingsUpdated:YES]; } @end 解决方法
正如我在帖子的评论中所说,我创建了一个新的PreferencesViewTest.xib,并逐步添加了GUI控件.我还添加了绑定,控制器等.一切都很好 – 没有闪烁.然后我将RETURN指定为Interface Builder中OK按钮的等效键.我再次启动应用程序来检查行为….它闪烁!我通过删除OK按钮中的等效键来双重检查前一个PreferencesView.xib的现象……它没有闪烁! – 疯狂的狗屎.但为什么..?
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |