gpt4 book ai didi

objective-c - 在 cocoa 中使用绑定(bind)时,更改未反射(reflect)在 View 中

转载 作者:行者123 更新时间:2023-12-03 17:04:58 26 4
gpt4 key购买 nike

我正在创建一些示例应用程序来理解 cocoa 中 View 导航、绑定(bind)等的概念。这是场景:我有一个窗口,在 MainMenu.Xib 中有一个选项卡 View (2 个选项卡)。我在第一个选项卡中有一个文本字段,在第二个选项卡中有一个标签。我希望它们都反射(reflect)相同的值,并且我想使用绑定(bind)来做到这一点。另外,我不想将提供给我的 View 与选项卡 View 一起使用。

这些是我已完成的步骤。

每个选项卡 View 项的 View 在 applicationDidFinishLaunching: 方法中使用以下代码单独设置:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
// Insert code here to initialize your application

//initialize view controllers
view1=[[ViewTab1 alloc] initWithNibName:@"ViewTab1" bundle:nil];
view2=[[ViewTab2 alloc] initWithNibName:@"ViewTab2" bundle:nil];


//set views
[[[myTabView tabViewItems] objectAtIndex:0]setView:view1.view];
[[[myTabView tabViewItems] objectAtIndex:1]setView:view2.view];


}
  • myTabView 是 AppDelegate 中 MainMenu.xib 选项卡 View 的导出引用。
  • ViewTab1 是第一个 View Controller (和 xib)的名称。
  • ViewTab2 是第二个 View Controller (和 xib)的名称。

ViewTab1 有一个文本字段(以及一个关联的标签)。我已将其绑定(bind)到 AppDelegate 中声明的变量(名称)。ViewTab2 有一个标签。我也将其绑定(bind)到 AppDelegate 中的同一变量。

变量“name”在 AppDelegate 的 init 方法中初始化。

AppDelegate.h

....
NSString *name;
....
@property(strong) ViewTab1 *view1;
@property(strong) ViewTab2 *view2;
@property (assign) IBOutlet NSTabView *myTabView;

@property (strong) NSString *name;
....

AppDelegate.m

....
@synthesize myTabView;
@synthesize view1,view2;
@synthesize name;
....
- (id)init {
self = [super init];
if (self) {
name=@"dummy";
}
return self;
....

除此之外,我还没有在我的程序中进行任何编码。

在 ViewTab1.xib 中,我得到了一个对象,并将其作为 AppDelegate 的实例,然后将应用程序对象(NSApplication)的委托(delegate)引用连接到同一对象。 (我希望这是获取 AppDelegate 对象的正确方法。)

我在 ViewTab2.xib 中做了同样的事情

然后我将 ViewTab1 中的文本字段和 ViewTab2 中的标签绑定(bind)到 AppDelegate 中的该变量。

当我运行程序时,文本字段和标签都显示“虚拟”。但是当我更改文本字段中的值时,它没有反射(reflect)在第二个选项卡(即 ViewTab2)的标签中。

请告诉我我做错了什么。

最佳答案

如何从任何加载的 Nib 建立到同一个应用程序委托(delegate)对象的绑定(bind)?

是的,我知道问题中所描述的这种令人沮丧的情况...经过数周和数百页的 KVO - 通知 - 绑定(bind)文档后,我认为有一个非常简单的解决方案。

我们可以在一些信息源中发现,nib 加载过程会产生新的成员实例...并且我们需要使用与旧实例的绑定(bind)连接。

请注意,加载 nib 后,InterfaceBuilder 中进行的绑定(bind)会自动重定向到这些新实例

为什么不将App delegate的指针重定向到旧实例?

在加载 Nib 的方法中,您可以在 Nib 加载之前和之后测试哪个对象是应用程序委托(delegate)。如果新的与前一个不同,您可以根据需要重定向它。

这个简单的示例适用于 10.5.8 下的 Xcode3,目标为 OSX10.5/i386:

// ***** SOMEWHERE IN DEFAULT APP-DELEGATE.m IMPLEMENTATION

- (IBAction) createOtherWindowFromNib: (id)sender
{
// ensure that app delegate is set as you want...
[NSApp setDelegate:self];
NSLog(@"APP-DELEGAT **** CREATE-TEST-WINDOW ***** WHO IS APP-DELEGATE BEFORE NIB LOAD: %@ ", [[NSApp delegate] description]);


// we can bind members of the nib to this controller over proxy object named "File’s Owner"
NSWindowController *otherWinCapo = [[NSWindowController alloc] initWithWindowNibName: @"OtherTestWindow"];

NSLog(@"APP-DELEGAT **** CREATE-TEST-WINDOW ***** WHO IS APP-DELEGATE AFTER NIB LOAD: %@ ", [[NSApp delegate] description]);

// make some test for delegates before/after here if you need ...
// usually your bindings made inside "OtherTestWindow.xib" by IB doesn’t works in this moment

// ... and some redirection if needed
[NSApp setDelegate:self];

// afer that the bind made in IB inside "OtherTestWindow.xib"
// referred to (proxy object) "Application.delegate.myBOOL" (Bind to:Application, Model Key Path:delegate.myBOOL)
// react to changes of myBOOL placed in default app delegate object as expected
// simultaneously in every open instance of "OtherTestWindow.xib"

[otherWinCapo showWindow: otherWinCapo.window]; // we need populate the window instance on screen to see it
}

关于objective-c - 在 cocoa 中使用绑定(bind)时,更改未反射(reflect)在 View 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11666917/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com