Objective-C - 调用从另一个类修改textField的方法

时间:2016-03-26 20:26:15

标签: objective-c methods nstextfield

我有两个问题:

  • 当我尝试从不同的类调用一个方法时(这个方法在检查一个条件后修改一个文本字段)该方法被很好地调用(statutInternet中的NSLog工作),但TextField没有被修改。 。 当我从(IBAction)互联网方法这样做时,它可以工作..任何解决方案?

  • 为什么Xcode要我在之前使用_调用我的变量(如internetTextfield)?

WindowsController.h

#import <Cocoa/Cocoa.h>

@interface WindowController : NSWindowController
@property (assign) IBOutlet NSTextField *internetLabel;

- (void)statutInternet;
- (IBAction)internet:(id)sender;

@end

WindowsController.m:

#import "WindowController.h"
@implementation WindowController

- (IBAction)internet:(id)sender;
{
   [self statutInternet];
}

- (void)statutInternet;
{
    NSLog(@"Callfunctionworks");
    if (condition) {
    [_internetLabel setStringValue:@"TxtFieldWorks!"];
    }

}

我尝试用另一个类调用方法statutInternet:

WindowController *fenetre = [[WindowController alloc] init];
[fenetre statutInternet];

2 个答案:

答案 0 :(得分:1)

  

当我尝试从不同的类调用方法时,它不起作用:

那是因为,您正在使用此代码创建另一个WindowController实例:

WindowController *fenetre = [[WindowController alloc] init];

这是同一个类的另一个新的独立实例,我猜你没有显示。因此,您希望引用已经显示的窗口而不是创建新实例。

  

为什么Xcode要我用之前用_调用我的变量(比如internetTextfield)?

那是因为当你使用@property声明变量时,它会做三件事:

  1. 通过将常规下划线(_)添加到变量名称的开头来创建内部变量。这就是为什么你_作为变量的前缀。
  2. 使用setter-getter方法。
  3. 在实施setter-getters时,在帐户中使用您使用的关键字(即分配,强,弱)。
  4. 你可以在这里阅读一个很好的讨论:@property and retain, assign, copy, nonatomic in Objective-C

答案 1 :(得分:0)

当您调用statutInternet方法时,尚未创建NSTextField(以及所有其他UI项目)。

加载窗口后,您的视图就会准备就绪:

_fenetre = [[WindowController alloc] initWithWindowNibName:@"WindowController"];
[_fenetre showWindow:_fenetre.window];
[_fenetre statutInternet];