Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 委托、出口和鼠标事件的类设计_Objective C_Cocoa - Fatal编程技术网

Objective c 委托、出口和鼠标事件的类设计

Objective c 委托、出口和鼠标事件的类设计,objective-c,cocoa,Objective C,Cocoa,这里有一个简化: 我有一个有几个按钮的应用程序。如果是第一次启动应用程序,我想做一些特殊的事情。在我的AppController类中,它是NSApp的一个委托,我使用委托方法-ApplicationIDFinishLaunching:来执行测试。在我检测到这是第一次之后,我首先想访问一些iboutlet。然后,我希望能够获得每个按钮的鼠标事件,以便我可以做其他事情 我搞不懂你想上什么课。我想为第一次启动创建一个新类(FirstLaunch),但我不确定从AppDelegate调用什么。另外,要获

这里有一个简化:

我有一个有几个按钮的应用程序。如果是第一次启动应用程序,我想做一些特殊的事情。在我的AppController类中,它是NSApp的一个委托,我使用委托方法-ApplicationIDFinishLaunching:来执行测试。在我检测到这是第一次之后,我首先想访问一些iboutlet。然后,我希望能够获得每个按钮的鼠标事件,以便我可以做其他事情

我搞不懂你想上什么课。我想为第一次启动创建一个新类(FirstLaunch),但我不确定从AppDelegate调用什么。另外,要获取鼠标事件,我不应该是按钮的子类,并且考虑到我有多个按钮,我很困惑。我可能会一个接一个地解决这些问题,但综合起来,它们让我感到困惑

分解后,我需要访问和操作我在IB中设置的IBOutlets,确定何时单击按钮(以及单击了哪个按钮)。我希望能够从另一个类中执行此操作,以避免将AppDelegate弄得一团糟

谢谢你的帮助


更清楚地说,我实际上想做的是用马特·杰梅尔的《马塔切德温多》通过一个按钮建立一个帮助泡泡。单击按钮时,气泡消失,另一个气泡放在其他地方。气泡将连接到主窗口中的控件。

我猜您想在第一次启动时显示一些额外的用户界面吗?如果它是一个单独的窗口,我建议创建
NSWindowController
的子类。将第一次运行用户界面的新NIB文件添加到项目中,并将文件所有者对象的类更改为
FirstLaunch
。控件将文件的所有者代理中的一条导线拖动到窗口上,以将其连接到
窗口
出口

通过向类中添加实例变量,可以创建
IBOutlet
s。如果你的应用程序只在Leopard或更高版本上运行,最好这样声明你的应用程序:

@interface FirstLaunch : NSWindowController {
    NSTextField *myTextField;
}

@property (nonatomic, retain) IBOutlet NSTextField *myTextField;

@end
- (IBAction)myButtonClicked:(id)sender;
在Interface Builder中,将控件从文件的所有者拖动一条导线到控件上,以将其与该插座关联。确保在类的
dealloc
方法中释放对每个
IBOutlet
的引用(如果您没有使用垃圾收集),否则您的应用程序将泄漏内存

按钮被单击时会发送操作消息,因此您需要为按钮提供一个要调用的操作方法。您可以通过声明一个具有如下签名的方法来实现:

@interface FirstLaunch : NSWindowController {
    NSTextField *myTextField;
}

@property (nonatomic, retain) IBOutlet NSTextField *myTextField;

@end
- (IBAction)myButtonClicked:(id)sender;
在Interface Builder中,您可以控制将一条线从按钮拖到窗口控制器上,然后选择
myButtonClicked:
方法

要完成所有这些工作,您需要创建窗口控制器的实例,并告诉它在运行时加载NIB文件。因此,在您的
AppDelegate
类中,当您确定这是第一次启动时,您将执行以下操作:

FirstLaunch *firstLaunchController = [[FirstLaunch alloc] initWithWindowNibName:@"nameOfNibFile"];
[firstLaunchController show:self];
您可能希望将对窗口控制器的引用保留在实例变量中,而不是像我在这里所做的那样保留在局部变量中。而且,根据您的应用程序,将其显示为工作表可能更有意义。但一旦你做到了这一点,你就可以自己想办法做到这一点

然后,我希望能够获得每个按钮的鼠标事件,以便我可以做其他事情

别担心老鼠。甚至可能没有鼠标(想想曾经流行的平板电脑Mac传闻)

我想为第一次启动创建一个新类(FirstLaunch),但我不确定从AppDelegate调用什么

你在这里有自己的方法。你可能会成为一个单身汉*;然后,您将实现一个名为
runFirstLaunchPanel:
的方法,这将是一个操作方法(稍后将详细介绍这些方法):

在nib中实例化对象,然后从应用程序委托调用动作方法,将
nil
作为发送方

将对象放在nib中并使该方法成为动作方法的原因是,这样可以很容易地将菜单项连接到它,以便用户可以在以后重新运行第一个启动面板。(例如,如果它是“起点”窗口,则可以将新菜单项连接到此操作,而不是默认操作。)

*是的,我看过关于单身的文章,我同意他们的观点。在这种情况下,没关系

另外,要获取鼠标事件

这是错误的想法。您需要做的是设置按钮,向控制器发送消息,使控制器(可能是
AppDelegate
)执行某些操作。您希望按钮发送的消息是一条操作消息

在拥有包含按钮窗口的nib的对象中实现操作方法。在类的标题中声明此方法,然后通过右键单击控制器并从正确操作方法的圆圈拖动到按钮,将按钮连接到IB中的该方法

这被称为目标动作范例,它将控制器的职责(做事情)与命令它们的视图隔离开来。因为每个动作方法只做一件事,所以您可以让一个按钮、一个菜单项,甚至另一个控制器(上面是您的应用程序代理)发送相同的动作消息,并且接收控制器不必关心哪个控件正在发送动作,因为它已经知道它必须做什么

我不应该是按钮的一个子类吗

不需要。除了Cocoa中的NSObject(或者,对于核心数据中的模型对象,NSManagedObject)之外,您很少创建其他任何对象的子类

请注意,我说的是“很少”,而不是“从不”。您必须创建偶尔的子类,特别是如果您想要创建自定义或自定义的视图和单元格(可能还有自定义的窗口)。然而,在Cocoa中,子类化并没有必要达到(我听说)它的程度