Cocoa绑定到一个窗口,IBAction和IBOutlet在不同的类中

时间:2014-11-06 03:04:57

标签: objective-c cocoa cocoa-bindings key-value-observing kvc

我正在尝试在一个班级IBAction中实施SuperDel并在另一个班级IBOutlet中访问SubC

类方法subMethod假设通过KVC / KVO更改查看器中NSString test的值。

从Xcode中的对象库我添加了一个控制器对象并将其链接到自定义类SubC。然后我将test绑定到SubC,使得关键路径是绑定检查器中的值(SubC.test)。

  • 当我从subMethod通过SubC致电(IBAction)startC时,一切正常。
  • 当我从subMethod通过SuperDel拨打(IBAction)start时,只显示NSLog。

self中的接收者subMethod似乎是问题的根/原因,因为问题仅在我从另一个类(SuperDel)调用该方法时出现。< / p>

有关如何解决此问题的任何建议?

UPDATE1: 我已经在下面制作了几个玩具代码的变种,问题仍然存在。 我只是不能让KVO和Cocoa绑定工作,除非我在同一个m文件中有IBAction和IBOutlet。 @stevesliva的建议似乎表明self不是问题,因为NSLog显示正确的类

UPDATE2: _test正确更新,self指向正确的课程。 唯一剩下的就是这行代码:[self didChangeValueForKey:@"test"],但这行不是必需的......

IBActionsubMethod类调用SubC时,视图已正确更新;当从另一个类调用IBAction时,视图从不更新...我不知道为什么不这样做。

请帮忙,这让我发疯了。

SuperDel.h:

#import <Cocoa/Cocoa.h>

@interface SuperDel: NSObject <NSApplicationDelegate>
@property (assign) IBOutlet NSWindow *window;
- (IBAction)start:(id)sender;
@end

SuperDel.h:

#import "SuperDel.h"
#import "SubC.h"
@implementation SuperDel
- (IBAction)start:(id)sender {
    SubC *parc = [[SubC alloc]init];
    [parc subMethod];
}
@end

SubC.h:

#import <Foundation/Foundation.h>
@interface SubC : NSObject {
//    NSString *test;                           
}
@property NSString *test;
//- (IBAction)startC:(id)sender;
- (void)subMethod;
@end

SubC.m:

#import "SubC.h"
@implementation SubC
@synthesize test;                             
- (id)init
{
    self = [super init];
    if (self) {
        [self setValue:@"*" forKey:@"test"];
    }
    return self;
}
/*
- (IBAction)startC:(id)sender {
    [self subMethod];   
}
*/
- (void)subMethod{    
    [self willChangeValueForKey:@"test"];     // Shouldn't be necessary
    [self setValue:@"Foo" forKey:@"test"];    // This only changes View if the method is called from within the class, i.e. via (IBAction)startC
    NSLog(@"test = %@", _test);               // This always results in: test = Foo
    [self didChangeValueForKey:@"test"];      // Shouldn't be necessary
    NSLog(@"Self = %@", self);                // Self = <SubC: 0x10014ae30>
    NSLog(@"This always displays");           // This displays regardless if called from (IBAction)startC or (IBAction)start
}
@end

0 个答案:

没有答案