在过去的几个小时里,我一直试图解决这个问题,包括大量搜索和观看视频。这就是我想要做的事情:
摘要:一个简单的窗口,允许我将邮件从收件箱移动到我的多个邮件文件夹中。当我输入我正在寻找的邮件文件夹的名称时,大纲视图应该自动刷新,只显示具有匹配文本的文件 - 如果你知道的话,请考虑MsgFiler。
当前结果:
#import "TextFieldDelegate.h"
#import "OutlineViewController.h"
#import "GetMailDatasource.h"
@implementation TextFieldDelegate
@synthesize testLabel;
- (void) controlTextDidChange :(NSNotification *) sender {
NSTextField *changedField = [sender object];
NSLog(@"in control text did change");
//Just some text code to see the change when text does change
NSString *text = [changedField stringValue];
[testLabel setStringValue:text];
NSLog(@"changed the label and creating the data now");
OutlineViewController *vc = [[OutlineViewController alloc] init];
[vc refreshTheData:sender];
[vc.outlineView reloadData];
[vc release];
}
- (void)controlTextDidEndEditing:(NSNotification *)obj {
NSLog(@"in end editting");
return;
}
@end
#import "OutlineViewController.h"
#import "GetMailDatasource.h"
@implementation OutlineViewController
- (id) init {
self = [super init];
if (self) {
_mailboxes = [[NSMutableArray alloc] init];
if (myMailboxes != nil) {
_mailboxes = myMailboxes;
} else {
GetMailDatasource *mailDatasource = [[GetMailDatasource alloc] init];
[mailDatasource createFakeData];
_mailboxes = myMailboxes;
}
}
NSLog(@"inited outline view controller");
return self;
}
- (IBAction) refreshTheData : (id) sender {
NSLog(@"in refreshTheData");
Mailbox *m = [self.outlineView itemAtRow:[self.outlineView selectedRow]];
if (m)
[m addChild:[[Mailbox alloc] init]];
else
[self.mailboxes addObject:[[Mailbox alloc] init]];
NSLog(@"running reloadData");
[self.outlineView reloadData];
}
#I know these work, but providing them for completeness
#pragma mark NSOutlineView Data Source Methods
- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item {
return !item ? [self.mailboxes count] : [[ item children] count ];
}
- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item {
return !item ? YES : [[item children ] count] != 0;
}
- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item {
return !item ? [self.mailboxes objectAtIndex:index] : [[item children] objectAtIndex:index];
}
- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {
return [item name];
}
@end
我确实有一个单独的“测试按钮”,我在界面上添加了尝试,我将它的“已发送动作”直接绑定到OutlineViewController上的“refreshTheData”函数,并且顺利运行。在NSOutlineView中添加新项目并立即更新。
我不确定还需要什么才能找出问题所在......任何建议都会非常感谢!
非常感谢!
答案 0 :(得分:0)
每次controlTextDidChange都会创建一个新实例。所以你改变了这个OutlineViewController的设置,然后释放它。
而不是这个,你应该在屏幕上使用大纲视图。
答案 1 :(得分:0)
解决了它。
所以,我已经在IB中有了大纲视图,在IB中有了OutlineViewController的对象。我甚至尝试使用与TextFieldDelegate关联的OutlineView对象在控制器中引用新方法“refreshTheData”。这就是我错的地方。
我需要做的是将OutlineViewController本身与TextFieldDelegate相关联,然后我可以使用IB界面中的相应链接调用“refreshTheData”。
所以,最后,代码看起来像这样,更改突出显示如下 - >:
#import <Foundation/Foundation.h>
--> #import "OutlineViewController.h"
@interface TextFieldDelegate : NSObject {
IBOutlet OutlineViewController *outlineView;
}
@property (nonatomic, strong) IBOutlet NSTextField * testLabel;
@property (nonatomic, strong) IBOutlet NSTextField * userInput;
- (IBAction) controlTextDidChange :(id) sender;
@end
这现在允许TextFieldDelegate.m的代码,得到识别:
- (void) controlTextDidChange :(NSNotification *) sender {
NSTextField *changedField = [sender object];
NSString *text = [changedField stringValue];
[testLabel setStringValue:text];
--> [outlineView refreshTheData:sender];
}
突出显示的行总是暗示它无法识别该方法,因为我试图在实际的NSOutlineView项目上使用它,而不是我创建方法的委托。我曾经想过,通过将代理连接到NSOutlineView,它们将成为同一个,或者通过传递性类型找到该方法。
感谢指针@Amin,它帮助我最终到达那里。