データ ソースとデリゲートを使用して NSTableview を使用するアプリケーションを実装しましたが、NSArrayController を使用したことがなく、使用したくありません。私の質問は、この状況で NSSearchField を NSTableView にバインドするにはどうすればよいですか? NSArrayController を使用して多くの回答を見てきました。NSMutableArray で問題なく動作しているため、実装を NSArrayController に変換したくありません。
2329 次
1 に答える
11
TableView は表示コントロールであり、フィルタリング用ではありません。2 つの NSArray プロパティを追加する必要があります。
1) @property(nonatomic, strong) NSArray *allItems;
2) @property(nonatomic, strong) NSArray *filteredItems;
#import "ViewController.h"
@interface ViewController()<NSSearchFieldDelegate, NSTableViewDelegate, NSTableViewDataSource>
// Your NSSearchField
@property (weak) IBOutlet NSSearchField *searchField;
// Your NSTableView
@property (weak) IBOutlet NSTableView *tableView;
// In this array you will store all items
@property(nonatomic, strong) NSArray *allItems;
// In this array you will store only filtered items
@property(nonatomic, strong) NSArray *filteredItems;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.searchField.delegate = self;// You can set delegate from XIB/Storyboard
self.tableView.delegate = self;// You can set delegate from XIB/Storyboard
self.tableView.dataSource = self;// You can set dataSource from XIB/Storyboard
self.allItems = @[@"Test1", @"Demo filter", @"Test 2", @"Abracadabra"];
[self applyFilterWithString:@""];
}
- (void)controlTextDidChange:(NSNotification *)obj{
if (obj.object == self.searchField) {
[self applyFilterWithString:self.searchField.stringValue];
}
}
-(void)applyFilterWithString:(NSString*)filter {
if (filter.length>0) {
NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"self CONTAINS[cd] %@", filter];
self.filteredItems = [self.allItems filteredArrayUsingPredicate:filterPredicate];
}
else {
self.filteredItems = self.allItems.copy;
}
[self.tableView reloadData];
}
#pragma mark - ***** NSTableViewDataSource, NSTableViewDelegate *****
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
return self.filteredItems.count;
}
// for the "Cell Based" TableView
- (nullable id)tableView:(NSTableView *)tableView objectValueForTableColumn:(nullable NSTableColumn *)tableColumn row:(NSInteger)row {
NSString *item = self.filteredItems[row];
return item;
}
@end
于 2015-10-10T10:34:43.080 に答える