0

在过去的几个小时里,我一直在尝试解决这个问题,其中涉及大量搜索和观看视频。这是我正在尝试做的事情:

摘要:一个简单的窗口,允许我将邮件从我的收件箱移动到我的许多邮件文件夹中的任何一个。当我输入我正在寻找的邮件文件夹的名称时,大纲视图应该会自动刷新,只显示具有匹配文本的那些——如果你知道的话,想想 MsgFiler。

  • 在文本框中键入文本
  • 当我键入每个字母时,我希望 NSOutlineView 更新它的数据,以使与我的输入文本匹配的文件夹越来越少。(目前,我的测试只是在 NSOutlineView 中添加了一个“测试邮箱”

当前结果

  • 在文本框中键入文本
  • 什么都没发生
  • 单击 NSOutlineView,视图得到更新

文本域委托.m:

#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

大纲视图控制器.m

#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 上的“刷新数据”函数,并且可以顺利运行。在 NSOutlineView 中添加新项目并立即更新。

我不确定要找出问题所在还需要什么...任何建议将不胜感激!

非常感谢!

4

2 回答 2

0

解决了。

所以,我已经在 IB 中有大纲视图和 IB 中的 OutlineViewController 对象。我什至尝试使用与我的 TextFieldDelegate 关联的 OutlineView 对象在我的控制器中引用新方法“refreshTheData”。那是我错的地方。

我需要做的是将 OutlineViewController 本身与我的 TextFieldDelegate 相关联,然后我可以在 IB 界面中使用适当的链接调用“refreshTheData”。

所以,最后,代码看起来像这样,更改突出显示如下-->:

TextFieldDelegate.h

#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;

@结尾

这现在允许 TextFieldDelegate.m 的代码得到认可:

- (void) controlTextDidChange :(NSNotification *) sender {
    NSTextField *changedField = [sender object];

    NSString *text = [changedField stringValue];
    [testLabel setStringValue:text];

    --> [outlineView refreshTheData:sender];
}

突出显示的行总是表明它无法识别该方法,因为我试图在实际的 NSOutlineView 项目上使用它,而不是我创建该方法的委托。我曾认为通过将委托连接到 NSOutlineView,它们要么会变得相同,要么会通过传递性找到方法。

感谢@Amin 的指点,它最终帮助我到达了那里。

于 2013-08-22T11:50:14.440 回答
0

每次 controlTextDidChange 都会创建一个新实例。所以你改变了这个 OutlineViewController 的设置然后释放它。

取而代之的是,您应该使用屏幕上的大纲视图。

于 2013-08-21T18:52:54.173 回答