NSOutlineView将不会重新加载keydown上的数据,而是重点更新

在过去的几个小时里,我一直试图解决这个问题,其中涉及很多搜索和观看视频。 以下是我想要做的事情:

简介 :一个简单的窗口,允许我将邮件从收件箱移动到任意多个邮件文件夹。 当我输入我正在查找的邮件文件夹的名称时,大纲视图应自动刷新,只显示带有匹配文本的邮件文件夹 - 如果知道它,请考虑MsgFiler。

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

  • 在文本框中输入文本
  • 什么都没发生
  • 点击NSOutlineView,视图得到更新
  • TextfieldDelegate.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
    

    OutlineViewController.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上的“refreshTheData”函数,并且工作顺利。 在NSOutlineView中添加新项目并立即更新。

    我不知道还有什么是必要的,试图找出问题所在......任何建议将不胜感激!

    非常感谢!


    每次controlTextDidChange时创建一个新实例。 所以你改变这个OutlineViewController的设置,并释放它。

    相反,你应该在屏幕上使用大纲视图。


    解决它。

    所以,我已经有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,它最终帮助我到达那里。

    链接地址: http://www.djcxy.com/p/85213.html

    上一篇: NSOutlineView won't reload data on keydown, but updates on focus

    下一篇: Intercept Keydown Actions in an NSTextFieldCell