【问题标题】:Calling a class method from another class in Objective-C (Cocoa)从Objective-C(Cocoa)中的另一个类调用类方法
【发布时间】:2011-12-02 21:35:30
【问题描述】:

我是 Cocoa 编程的新手,所以我仍在努力掌握一些基本概念。

我想做的(例如)是编写一个包含多个NSTextFields 的应用程序。但是,这些NSTextFields 需要链接到单独的类。此外,每个单独的类都需要能够相互获取和设置数据。

我尝试添加方法来解决这个问题,但无济于事。假设这是文本框原始类中的一个方法,我想从另一个类中调用它。

-(void)settextfield:(NSString*)stringy;
{
    [TextField setStringValue:stringy];
}   

这是调用代码(我们从另一个类 TestClass 调用它)...

-(IBAction)test:sender;
{
 [BundleBrowseTextBox settextfield: @"Testy"];
}

什么都没有发生。可能有一些明显的方法可以做到这一点,但我无法通过 Google 搜索发现这一点。

【问题讨论】:

  • 在您了解了更多有关如何使用类的知识后,您应该看看Coding Guidelines for Cocoa,它向您展示了如何正确命名类、实例和方法。

标签: objective-c macos cocoa


【解决方案1】:

我的错误是我调用的是类方法而不是实例...您可以通过 IBOutlets 调用实例并在 Interface Builder 中正确定义这些出口。

【讨论】:

    【解决方案2】:

    您需要确保您使用的指针不为零。

    关于 objC 的一个奇怪/方便的事情是您可以将消息传递给 nil 并且它不会崩溃。

    【讨论】:

      【解决方案3】:

      如果我假设您尝试在 BundleBrowseTextBox 的实例中设置文本是正确的,您应该在实例名称而不是类名称上调用 settextfield: 消息(如果 BundleBrowseTextBox 是实例 -而不是类——为了清楚起见,你真的应该避免使用大写的实例名称)。即:

      -(IBAction)test:(id)sender;
      {
         // Assuming bbtBox is defined as an instance of BundleBrowseTextBox
         [bbtBox settextfield: @"Testy"];
      }
      

      【讨论】:

      • 我让 Interface Builder 为我初始化实例。我猜这是我没有设置任何初始化代码的惩罚? :P
      • 基本上,我知道如何初始化类,并且我知道实例和类之间的区别,但是,我不知道这与接口生成器有什么关系。
      【解决方案4】:

      我相信您忘记了原始帖子中的参数类型 这……

            -(IBAction)test:sender;
            {
              [BundleBrowseTextBox settextfield: @"Testy"];
            }
      

      应该是

         -(IBAction)test:(id)sender;
         {
            [BundleBrowseTextBox settextfield: @"Testy"];
         }
      

      除此之外,如果您按照您所说的那样理解类和实例之间的区别。 如果您能向我们展示其余的实现和接口,那就太好了。 问题可能不在您向我们展示的代码 sn-ps 中。

      【讨论】:

        猜你喜欢
        • 2015-07-10
        • 1970-01-01
        • 2013-03-05
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 2015-08-01
        • 2016-04-25
        相关资源
        最近更新 更多