这是一个简化:
我有一个带有几个按钮的应用程序。如果这是第一次启动应用程序,我想做一些特别的事情。在我的AppController类中,它是NSApp的委托,我使用委托方法-applicationDidFinishLaunching:来执行测试。在我发现这是第一次之后,我首先想要访问一些IBOutlets。然后,我希望能够为每个按钮获取鼠标事件,以便我可以做其他事情。
我无法想出要对这些课程做些什么。我想为第一次发布创建一个新类(FirstLaunch),但我不确定从AppDelegate调用什么。另外,要获取鼠标事件,我不应该成为按钮的子类,并且考虑到我有多个按钮,我很困惑。我可能会逐一解决这些问题,但总而言之,他们让我很困惑。
分解,我需要访问&操纵我在IB中设置的IBOutlets,确定何时单击按钮(以及单击了哪个按钮)。我希望能够从另一个班级做到这一点,以免混乱AppDelegate。
感谢您的帮助!
更清楚的是,我实际上要做的是使用Matt Gemmel的MAAttachedWindow通过按钮提供帮助气泡。单击按钮时,气泡消失,另一个气泡放在其他位置。气泡将附加到主窗口中的控件。
答案 0 :(得分:2)
我猜你想在首次发布时展示一些额外的用户界面?如果它是一个单独的窗口,我建议创建一个NSWindowController
的子类。为项目的首次运行用户界面添加新的NIB文件,并将File的Owner对象的类更改为FirstLaunch
。控制 - 将文件所有者委托中的电线拖到窗口上,将其与window
插座连接。
通过向类添加实例变量来创建IBOutlet
。如果您的应用只能在Leopard或更高版本上运行,最好像这样声明您的商店:
@interface FirstLaunch : NSWindowController {
NSTextField *myTextField;
}
@property (nonatomic, retain) IBOutlet NSTextField *myTextField;
@end
在Interface Builder中,您可以控制 - 将文件所有者的电线拖到控件上,以将其与该插座相关联。确保您在班级的IBOutlet
方法中发布对dealloc
的每个- (IBAction)myButtonClicked:(id)sender;
的引用(如果您没有使用垃圾回收),否则您的应用会泄漏内存。
按钮在单击时发送操作消息,因此您需要为按钮提供操作方法以进行调用。您可以通过声明具有如下签名的方法来实现:
myButtonClicked:
在Interface Builder中,您可以控制 - 将按钮中的导线拖到窗口控制器上,然后选择AppDelegate
方法。
要完成所有这些工作,您需要创建一个窗口控制器实例并告诉它在运行时加载NIB文件。所以,在你的FirstLaunch *firstLaunchController = [[FirstLaunch alloc] initWithWindowNibName:@"nameOfNibFile"];
[firstLaunchController show:self];
课程中,当你确定这是第一次启动时,你会这样做:
{{1}}
您可能希望在实例变量中保留对窗口控制器的引用,而不是像我在这里完成的那样使用局部变量。而且,根据您的应用程序,将其显示为工作表可能更有意义。但是,一旦你做到这一点,你将能够找到自己如何做到这一点。
答案 1 :(得分:0)
然后,我希望能够为每个按钮获取鼠标事件,以便我可以做其他事情。
不要担心鼠标。甚至可能没有 鼠标(想想那些流行的平板电脑 - 麦谣传闻)。
我想为第一次发布创建一个新类(FirstLaunch),但我不确定从AppDelegate调用什么。
你在这里制作自己的方法。你可能会把它变成单身*;然后,你将实现一个名为runFirstLaunchPanel:
的方法,这将是一个动作方法(稍后会详细介绍):
- (IBAction) runFirstLaunchPanel:(id)sender;
在nib中实例化对象,然后从应用委托中调用以nil
作为发件人的操作方法。
将对象放入nib并将该方法设置为操作方法的原因是,这样可以轻松地将菜单项连接到它,以便用户可以在以后重新运行第一个启动面板时间。 (例如,如果它是“起始点”窗口,则可以将“新建”菜单项连接到此操作而不是默认操作。)
*是的,我看过关于单身人士的文章,我同意他们的观点。在这样的情况下,没关系。
另外,要获取鼠标事件,
这是错误的思考方式。您需要做的是将按钮设置为向控制器发送消息以使控制器(可能AppDelegate
)执行某些操作。您希望按钮发送的消息是一条操作消息。
在拥有包含带按钮的窗口的nib的对象中实现一个action方法。在类的标题中声明此方法,然后通过右键单击控制器并从正确的操作方法的圆圈拖动到按钮,将按钮连接到IB中。
这称为目标 - 行动范式,它将控制器职责(服务)与订购它们的视图隔离开来。因为每个动作方法只做一件事,你可以有一个按钮,一个菜单项,甚至另一个控制器(上面你的app委托)发送相同的动作消息,接收控制器将不必关心哪个控件正在发送行动,因为它已经知道它必须做什么。
我不应该是按钮的子类,
没有。您很少在Cocoa中创建除NSObject之外的任何子类(或者,对于Core Data中的模型对象,NSManagedObject)。
请注意,我说“很少”,而不是“从不”。您将不得不偶尔创建子类,特别是如果您想要创建自定义或自定义视图和单元格(以及可能是自定义窗口)。但是,Cocoa中的子类化不是必需的,其程度(我听说)它在其他平台上的其他框架中。
考虑到我有多个按钮,我很困惑。
目标 - 动作范例意味着您不必为每个按钮创建一个按钮子类。一个控制器类实现所有操作和库存按钮,因为你已经将它们连接到IB中,只需告诉控制器“执行此操作”。
分解,我需要访问&操纵我在IB中设置的IBOutlets
可能不是。至少,没有你想象的那么多。
确定何时单击按钮(以及单击了哪个按钮)。
不。按钮会担心被点击;你只是担心将它们设置为发送,然后回应它们的动作消息。