我看到了Cocoa的KVC/KVO和绑定的一些古怪行为.我有一个NSArrayController对象,它的'content'绑定到一个NSMutableArray,我有一个控制器注册为该arrangedObjects属性的观察者NSArrayController.通过此设置,我希望每次修改阵列时都会收到KVO通知.但是,似乎KVO通知仅发送一次; 第一次修改数组.
我在Xcode中设置了一个全新的"Cocoa Application"项目来说明问题.这是我的代码:
BindingTesterAppDelegate.h
#import <Cocoa/Cocoa.h>
@interface BindingTesterAppDelegate : NSObject <NSApplicationDelegate>
{
NSWindow * window;
NSArrayController * arrayController;
NSMutableArray * mutableArray;
}
@property (assign) IBOutlet NSWindow * window;
@property (retain) NSArrayController * arrayController;
@property (retain) NSMutableArray * mutableArray;
- (void)changeArray:(id)sender;
@end
Run Code Online (Sandbox Code Playgroud)
BindingTesterAppDelegate.m
#import "BindingTesterAppDelegate.h"
@implementation BindingTesterAppDelegate
@synthesize window;
@synthesize arrayController;
@synthesize mutableArray;
- (void)applicationDidFinishLaunching:(NSNotification *)notification
{
NSLog(@"load");
// create the array controller and the mutable array:
[self setArrayController:[[[NSArrayController alloc] init] autorelease]]; …Run Code Online (Sandbox Code Playgroud) 我需要KVO的一些帮助,我差不多在那里.我想要做的是在树控制器中的某些内容发生变化时触发一个方法.
所以我使用这段代码注册为KVO.
[theObject addObserver: self
forKeyPath: @"myKeyPath"
options: NSKeyValueObservingOptionNew
context: NULL];
Run Code Online (Sandbox Code Playgroud)
但是,当我观察的关键路径发生变化时,如何触发方法?
还有一个额外的问题,当我将自己添加为观察者时,我希望关键路径成为我的核心数据模型中的属性,我是否已正确完成?
cocoa core-data objective-c key-value-observing cocoa-bindings
从这个问题借来的标题,其中一个不重复.在那里看到我的答案,因为那个提问者出了什么问题; 我是那个答案的作者,而我的问题不是那个问题.
我有一个包含三列的表视图,其Value绑定绑定到arrangedObjects数组控制器的三个属性.数组控制器contentArray绑定到visitationResults我的文档对象; 该数组中的项是模型类(VisitationResult)的实例.我还绑定了数组控制器selectionIndexes和sortDescriptors我的文档的属性.
我通过几个访问者改变我的财产:
- (void) addVisitationResult:(VisitationResult *)newVisitationResult {
[self insertObject:newVisitationResult inVisitationResultsAtIndex:[self countOfVisitationResults]];
NSLog(@"arrayController arrangedObjects: %@", [arrayController arrangedObjects]);
}
Run Code Online (Sandbox Code Playgroud)
该NSLog语句运行,并确认阵列控制器正在收集和排列我的模型对象.这意味着我正在通过我的财产并获取我的文件的KVO通知(这证明了先前的提问者的问题,绕过该属性的问题,不是我遇到的问题).
我NSLog在模型对象类的访问器方法中添加了语句.其中一个是由数组控制器调用,以便对对象进行排序(该属性是排序键).阵列控制器不知道的其他两个从未被调用过.
因此,我的表格视图仍为空白.
在我的模型中,我得到了一个NSMutableArray跟踪元素数量变化的东西.在我看来,我得到了一个NSTextField显示元素数量.
视图从nib文件中取消归档并分配/进入模式.因此,它知道modell和包含的数组.
我建立了如下连接.在文本字段的Interface Builder中,我添加了一个Cocoa Binding "路径",如下所示:myModell.myArray.@count.通过这个我可以访问count属性(这是因为阵列本身必须不改变).
绑定基于键值合规性,我在模型中建立了这一点,因此可以访问数组.但是,关键价值合规不是问题的一部分.
我的问题:如何将绑定放入源代码而不将其写入Interface Builder?
cocoa interface-builder key-value-observing key-value-coding cocoa-bindings
而不是试图运行一堆测试.有人知道资源密集程度较低吗?
绑定,KVO或通知?有人测试过吗?
我试图把我绑NSArraycontroller在一个NSMutableArray; 该数组包含"iData"类型的对象(它是一个自定义类).该类还包含一些NSMutableString变量,这些变量被设置为KVC的键.然后我将my绑定NSTableColumn到NSArrayController并分别设置每列的关键模型路径.
当我尝试填充数组时,GUI不会显示任何内容.我忘记了什么?
objective-c nstableview nstablecolumn nsarraycontroller cocoa-bindings
具有单列的基于视图的NSTableView.每个'单元'包含几个NSTextFields,一个NSImageView和一个NSButton,所有这些都绑定到Table Cell View的objectValue的各种属性.NSTableView的内容绑定到NSArrayController的arrangeObjects,NSArrayController处于Entity模式并绑定到相关的NSManagedObjectContext.
NSTextFields和NSImageView按预期运行.但是,出于某种原因,NSButton没有.它总是被禁用.我已将其参数绑定到objectValue的属性,并将其目标绑定到File的所有者.实验表明它是参数绑定而不是引起麻烦的目标绑定.印象是参数值必须为nil,因此导致按钮被禁用.然而它实际上不可能,因为其他绑定(NSTextFields等)工作正常.
我在基于单元格的表视图中多次使用了按钮参数/目标绑定而没有任何问题.所以我想也许基于视图的表视图有一些特征,这意味着这样的绑定不起作用.但Apple的TableViewPlayground示例使用这种方法(在HUD面板中)没有问题.我的绑定以完全相同的方式设置.我能看到的唯一区别是,Apple的示例使用了类模式阵列控制器,而我的是实体模式.但我无法相信这就是问题(或者至少我非常希望它不会是一个严重的弱点).
我有一个自定义类(NSView实际上让我们说一个修改过的编辑器的子类,但不是它的子类NSTextView)我以NSArrayController编程方式绑定(我绝对不能通过Interface Builder来实现),如下所示:
[myEditor bind:@"string"
toObject:myController
withKeyPath:@"selection.content"
options:nil];
Run Code Online (Sandbox Code Playgroud)
上面的工作,但是当值改变时,它不会更新到我的NSArrayController- 它就好像它没有"坚持".
我甚至试过,使用options下面,但无济于事:
NSDictionary* options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES],NSContinuouslyUpdatesValueBindingOption,
[NSNumber numberWithBool:YES],NSAllowsEditingMultipleValuesSelectionBindingOption,
[NSNumber numberWithBool:YES],NSConditionallySetsEditableBindingOption,
[NSNumber numberWithBool:YES],NSRaisesForNotApplicableKeysBindingOption,
nil];
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我是Cocoa的新手.我正在显示一个简单的Tableview,其中填充了NSMutableArray,它绑定到NSArrayController,如下所示
[_arrController bind:@"contentArray" toObject:self withKeyPath:@"dataArray" options:nil];
Run Code Online (Sandbox Code Playgroud)
这里_arrController是我的NSArrayController的IBoutlet,dataArray是带有数据的NSmutableArray.
当我以编程方式进行绑定时,我成功地填充了Tableview.但是我无法通过Interface Builder实现相同的绑定.
我选择了我的IB中的ArrayController,转到绑定部分,并通过选择模型键路径作为dataArray.But尝试在控制器部分下进行绑定.但是,我的表没有填充数据,其中以编程方式我可以轻松地完成我的任务.任何帮助表示赞赏.
我NSTextField在一个视图中绑定到该视图的视图控制器中的值。当按下按钮时,我希望使文本字段不再可编辑,因此我使用以下代码:
- (IBAction)makeTextFieldNotEditable:(id)sender {
self.textField.editable = NO;
}
Run Code Online (Sandbox Code Playgroud)
一切都正确绑定,当我按下按钮时,我可以确认上述方法被调用,但文本字段仍可编辑。我怎样才能解决这个问题?
cocoa-bindings ×10
cocoa ×8
objective-c ×4
nstableview ×3
macos ×2
core-data ×1
nsbutton ×1
nstextfield ×1
resources ×1