IBOutlet已连接但无法正常工作

时间:2013-03-15 23:51:57

标签: objective-c cocoa iboutlet

我有一个带有IBAction的类(dicecontroller),它会触发一些IBOutlets,一切都很开心。我发现了一种更好的方法来组织我的代码并将IBAction放在另一个类(playercommand)中。 playercomman在dicecontroller中调用一个包含所有IBOutlet的方法,除了现在没有任何一个显示任何东西。我用xib重新连接了这些插座,甚至建立了新的插座,没有任何形式的IBOutlets似乎工作。然而,NSLog工作正常,我传递的数组正在接受。

我遇到了Xcode很奇怪并且最近崩溃的问题,这是通过重新安装Xcode来解决的,我再次这样做认为这可能是另一个故障,但没有爱。我认为这是IB的一些细微差别,我只是不知道

我也不知道怎么看这个,一直想找几个小时的东西。帮助会令人鼓舞。

PlayerCommand.h

#import "DiceRoll.h"
#import "diceController.h"

@interface playerCommand : NSObject

- (IBAction)roll:(NSButton *)sender;

@end

Playercommand.m

#import "playerCommand.h"

@implementation playerCommand

- (IBAction)roll:(NSButton *)sender {

    DiceRoll *currentTurn = [[DiceRoll alloc] init];
    [currentTurn rolldice];

    diceController *currentFields = [[diceController alloc] init];
    [currentFields updatetockNameField:[currentTurn diceValuesArray]];

}
@end

dicecontroller.h

@interface diceController : NSObject

-(void)updatetockNameField: (NSArray*) diceValues;

@end

dicecontroller.m

#import "diceController.h"

// declaring private properties

@interface diceController()

@property (weak) IBOutlet NSTextField *ActionField;

@property (weak) IBOutlet NSTextField *QuantityField;

@end

@implementation diceController

-(void)updatetockNameField:(NSArray *) diceValues {

    switch ([[diceValues objectAtIndex:2] integerValue]) {
      case 0 ... 1:
        [[self ActionField] setStringValue:@"Up"];
        break;
      case 2 ... 3:
        [[self ActionField] setStringValue:@"Down"];
        break;
      case 4 ... 5:
        [[self ActionField] setStringValue:@"Div"];
        break;
      default:
        [[self ActionField] setStringValue:@"Err"];
        break;
    }

    switch ([[diceValues objectAtIndex:2] integerValue]) {
      case 0 ... 1:
        [[self QuantityField] setIntegerValue:5];
        break;
      case 2 ... 3:
        [[self QuantityField] setIntegerValue:10];
        break;
      case 4 ... 5:
        [[self QuantityField] setIntegerValue:20];
        break;
      default:
        [[self QuantityField] setStringValue:@"E"];
        break;
    }

} //end of updatetockNameField method


@end

1 个答案:

答案 0 :(得分:1)

问题在于:

  

diceController *currentFields = [[diceController alloc] init];

diceController实例是一个新实例(您在此行中创建它)。这与您已在笔尖中放置和配置的diceController实例不同。

如果您的playerCommand实例需要引用nib中的diceController实例,那么您可以在playerCommand中创建一个IBOutlet并将其连接到diceController实例你的笔尖。

BTW,playerCommanddiceController应分别命名为PlayerCommandDiceController