gpt4 book ai didi

objective-c - 双击 NSTableView 中的行不显示新 View

转载 作者:太空狗 更新时间:2023-10-30 03:29:34 25 4
gpt4 key购买 nike

我有一个使用核心数据的 os x 应用程序。

我的应用程序中有 3 个 .xib 文件,它们是:

1. MainMenu.xib
2. MasterTableViewController.xib
3. DetailViewController.xib

启动时,应用会显示一个包含 NSTableView 的 View ,其中包含几条记录。

我将该 View 命名为 MasterTableViewController

我希望当用户双击该行时,隐藏“主” View 并显示我的“详细” View 。我将该 View 命名为 DetailViewController。

当在“主” View 中双击 NSTableView 中的行时,没有任何反应,“主” View 仍然可见。我想要的是“主” View 消失,“细节” View 出现。

这是我现在的代码,更多解释如下:

AppDelegate.h

#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate>

@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;


@property (nonatomic,strong) NSViewController *mainAppViewController;
@property (weak) IBOutlet NSView *mainAppView;
- (void)changeViewController:(NSInteger)tag;

@property (weak) IBOutlet NSTableView *websitesTableView;
- (void)tableViewDoubleClick:(id)nid;

@end

AppDelegate.m

#import "AppDelegate.h"
#import "MasterTableViewController.h"
#import "DetailViewController.h"
@interface AppDelegate ()

@property (weak) IBOutlet NSWindow *window;
- (IBAction)saveAction:(id)sender;

@end

@implementation AppDelegate

NSString *const masterTable = @"MasterTableViewController";
NSString *const detail = @"DetailViewController";


-(void)awakeFromNib {
[_websitesTableView setTarget:self];
[_websitesTableView setDoubleAction:@selector(tableViewDoubleClick:)];
}

- (void)tableViewDoubleClick:(id)nid {
NSInteger rowNumber = [_websitesTableView clickedRow];
NSTableColumn *column = [_websitesTableView tableColumnWithIdentifier:@"websiteUrl"];
NSCell *cell = [column dataCellForRow:rowNumber];

NSInteger tag = 2;
[self changeViewController:tag];
}

- (void)changeViewController:(NSInteger)tag {

[[_mainAppViewController view]removeFromSuperview];
switch (tag) {
case 1:
self.mainAppViewController = [[MasterTableViewController alloc]initWithNibName:masterTable bundle:nil];
break;

case 2:
self.mainAppViewController = [[DetailViewController alloc]initWithNibName:detail bundle:nil];
break;

}

[_mainAppView addSubview:[_mainAppViewController view]];
[[_mainAppViewController view] setFrame:[_mainAppView bounds]];
[[_mainAppViewController view] setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];

}


- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
// automatically run the master table view controller
NSInteger tag = 1;
[self changeViewController:tag];
}

现在,有些人可能想知道,其余代码在哪里。我在 AppDelegage.m 中省略了下面核心数据的样板代码,因为它没有改变。我使用绑定(bind)来使我的 NSTableView 工作并显示我的记录,因此 MasterTableViewController.h 和 .m 文件为空,DetailViewController.h 和 .m 文件也是如此。

重要说明 - 我在这里无法理解的地方: 如果我在 applicationDidFinishLaunching 方法中更改 2 中的标签,详细 View 会正常显示,但如果我将其切换回 1,然后双击该行,“主” View (使用 NSTableView)仍然可见,并且没有任何反应( View 未交换)

谁能帮我找出我的代码有什么问题?

问候,约翰

最佳答案

您显然在 MasterTableViewController.xib 文件中实例化了 AppDelegate 类的第二个实例。应该只有一个 AppDelegate 实例,这就是 MainMenu.xib 中的实例。所以,它不应该在 MasterTableViewController.xib 中。

其中一个实例从表中接收双击操作方法,但另一个实例是带有主窗口导出的实例。

您需要(编辑)摆脱第二个实例并找到另一种方式从 MasterTableViewController 访问应用委托(delegate)。

关于objective-c - 双击 NSTableView 中的行不显示新 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31986075/

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