我正在尝试在一个班级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"]
,但这行不是必需的......
IBAction
从subMethod
类调用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