objective-c - 委托(delegate)、 socket 和鼠标事件的类设计

标签 objective-c cocoa

这里有一个简化:

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

我不知道要参加这些类(class)。我想为第一次启动创建一个新类(FirstLaunch),但我不确定要从 AppDelegate 调用什么。另外,为了获取鼠标事件,我不应该是按钮的子类吗?考虑到我有多个按钮,我很困惑。我可能可以一一解决这些问题,但总的来说,它们让我感到困惑。

具体来说,我需要访问和操作我在 IB 中设置的 IBOutlet,确定何时单击按钮(以及单击了哪个按钮)。我希望能够从另一个类中执行此操作,以免使 AppDelegate 变得困惑。

感谢您的帮助!

更清楚地说,我实际上想做的是使用 Matt Gemmel 的 MAAttachedWindow 通过按钮来显示帮助气泡。当点击按钮时,气泡消失,另一个气泡被放在其他地方。气泡将附加到主窗口中的控件。

最佳答案

我猜您想在第一次启动时显示一些额外的用户界面?如果它是一个单独的窗口,我建议创建 NSWindowController 的子类。将首次运行用户界面的新 NIB 文件添加到您的项目中,并将文件所有者对象的类更改为 FirstLaunch。按住 Control 键并将一条电线从文件所有者委托(delegate)拖动到窗口上,以将其与 window socket 连接起来。

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

@interface FirstLaunch : NSWindowController {
    NSTextField *myTextField;
}

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

@end

在 Interface Builder 中,您可以按住 Control 键将一条连线从文件所有者拖到控件上,以将其与该 socket 关联起来。确保在类的 dealloc 方法中释放对每个 IBOutlet 的引用(如果您没有使用垃圾回收),否则您的应用将泄漏内存。

按钮在单击时会发送操作消息,因此您需要提供一个操作方法供按钮调用。您可以通过声明一个带有如下签名的方法来做到这一点:

- (IBAction)myButtonClicked:(id)sender;

在 Interface Builder 中,您可以按住 Control 键将一条连线从按钮拖动到窗口 Controller 上,然后选择 myButtonClicked: 方法。

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

FirstLaunch *firstLaunchController = [[FirstLaunch alloc] initWithWindowNibName:@"nameOfNibFile"];
[firstLaunchController show:self];

您可能希望将对窗口 Controller 的引用保留在实例变量中,而不是像我在这里所做的那样保留在局部变量中。而且,根据您的应用程序,将其显示为表格可能更有意义。但一旦您做到了这一点,您将能够自己弄清楚如何做到这一点。

关于objective-c - 委托(delegate)、 socket 和鼠标事件的类设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/912583/

相关文章:

objective-c - 如何检查可变参数列表中的 int ?

objective-c - nextKeyView 不起作用

objective-c - 如何制作一组常量,以提高方法的可用性?

java - Protocol Buffer : From Java to Objective-C using byte[]

objective-c - 发送 NSCFCalendar nil NSDate 讽刺错误

iphone - 未记录的 iPhone API - 发现和使用

iphone - iOS:如何在输入文本字段后发送键盘

objective-c - 如何在 NSTableView 中选择一个 NSCell?

cocoa - 如何在不改变当前内容的情况下改变 NSTextView 的字体?

ios - locationForGlyphAtIndex 返回错误值