gpt4 book ai didi

Cocoa 类不在 NSWindow 中显示数据

转载 作者:行者123 更新时间:2023-12-03 17:08:09 25 4
gpt4 key购买 nike

我有一个类控制一个窗口,另一个类控制同一 xib 中的另一个窗口,但是,第二个窗口永远不会显示它应该显示的内容。

在第一个类中,我分配并初始化第二个类,然后向它传递一些信息。在第二个类中,它在 TableView 中显示该数据。
是的,在 .xib 中,我已正确设置所有连接,我已经进行了四重检查。代码也是正确的,与连接相同,我已经四重检查了。

编辑:是的,数组中有数据,并且类是 NSObject。

Edit2:我有点发现了问题。由于某种原因,数组填充了内容,但它返回 0 作为计数。

编辑 9000:

代码如下:

答案.h

#import <Cocoa/Cocoa.h>
@interface MSAnswerView : NSObject {
IBOutlet NSWindow *window;
NSArray *User;
NSArray *Vote;
NSArray *Text;
IBOutlet NSTableView *view;
IBOutlet NSTableColumn *voteCount;
IBOutlet NSTableColumn *saidUser;
IBOutlet NSTextView *body;
}
-(void)setUpWithVoteCount:(NSArray *)array User:(NSArray *)user Text:(NSArray *)text;

@property (nonatomic, retain) NSWindow *window;
@property (nonatomic, retain) NSTableView *view;
@property (nonatomic, retain) NSTableColumn *voteCount;
@property (nonatomic, retain) NSTableColumn *saidUser;
@property (nonatomic, retain) NSTextView *body;
@end

.m

#import "MSAnswerView.h"
@implementation MSAnswerView
@synthesize view;
@synthesize voteCount;
@synthesize saidUser;
@synthesize body;
@synthesize window;
-(void)awakeFromNib
{
[view setTarget:self];
[view setDoubleAction:@selector(bodydata)];
[view reloadData];
}
-(void)setUpWithVoteCount:(NSArray *)array User:(NSArray *)user Text:(NSArray *)text
{
Vote = array;
User = user;
Text = text;
if (window.isVisible = YES) {
[view reloadData];
[view setNeedsDisplay];

}
}
-(int)numberOfRowsInTableView:(NSTableView *)aTable
{
return [User count];;
}

-(id)tableView:(NSTableView *)aTable objectValueForTableColumn:(NSTableColumn *)aCol row:(int)aRow
{
if (aCol == voteCount)
{
return [Vote objectAtIndex:aRow];
}
else if (aCol == saidUser)
{
return [User objectAtIndex:aRow];
}
else
{
return nil;
}


}

-(void)bodydata
{
int index = [view selectedRow];
[body setString:[Text objectAtIndex:index]];
}

@end

最佳答案

您的代码中存在很多问题。

一方面,-setUpWithVoteCount:User:Text: 中的比较不正确:

window.isVisible = YES

那应该是比较运算符,==而不是赋值运算符=

其次,您错误地命名了 ivars 和方法。实例变量(事实上,任何类型的变量)应该以小写字母开头。这是为了将它们与类名区分开。查看Apple coding guidelines .

我还建议,对于存储像 NSArray 这样的集合的变量来说,像 text 这样的名称是一个不好的名称。相反,您应该将其命名为 textItems 之类的名称,这样就可以清楚地看出该变量代表一个集合而不是单个字符串。

此外,类本身的命名也很糟糕。您已将其命名为 MSAnswerView 但它不是 View ,而是某种类型的窗口 Controller 。至少将其命名为 MSAnswerWindowController。更好的方法是使其成为 NSWindowController 的子类,并在自己的 Nib 中使其成为文件所有者。这是窗口 Controller 的标准模式。

你的方法-setUpWithVoteCount:User:Text:实际上应该是一个初始化器:

- initWithVoteCount:user:text:

这样就很清楚它的用途,并且应该在对象创建时调用一次。

然而,主要问题是您没有保留传递给设置方法的值。这意味着如果没有其他对象保留对它们的引用,它们将在未来的某个不确定的时刻消失。如果您稍后访问它们,您将崩溃或至少收到错误的数据,这就是正在发生的情况。

当然,在这种情况下,您还必须添加一个 -dealloc 方法,以确保在使用完对象后释放它们。

将所有这些建议放在一起,您的类应该看起来像这样:

MSAnswerWindowController.h:

#import <Cocoa/Cocoa.h>

//subclass of NSWindowController
@interface MSAnswerWindowController : NSWindowController <NSTableViewDataSource>
{
//renamed ivars
NSArray *users;
NSArray *voteCounts;
NSArray *textItems;
IBOutlet NSTableView *view;
IBOutlet NSTableColumn *voteCount;
IBOutlet NSTableColumn *saidUser;
IBOutlet NSTextView *body;
}

//this is now an init method
- (id)initWithVoteCounts:(NSArray *)someVoteCounts users:(NSArray *)someUsers textItems:(NSArray *)items;

//accessors for the ivars
@property (nonatomic, copy) NSArray* users;
@property (nonatomic, copy) NSArray* voteCounts;
@property (nonatomic, copy) NSArray* textItems;

@property (nonatomic, retain) NSWindow *window;
@property (nonatomic, retain) NSTableView *view;
@property (nonatomic, retain) NSTableColumn *voteCount;
@property (nonatomic, retain) NSTableColumn *saidUser;
@property (nonatomic, retain) NSTextView *body;
@end

MSAnswerWindowController.m:

#import "MSAnswerWindowController.h"

@implementation MSAnswerWindowController

//implement the init method
- (id)initWithVoteCounts:(NSArray*)someVoteCounts users:(NSArray*)someUsers textItems:(NSArray*)items
{
//this is an NSWindowController, so tell super to load the nib
self = [super initWithWindowNibName:@"MSAnswerWindow"];
if(self)
{
//copy all the arrays that are passed in
//this means we hold a strong reference to them
users = [someUsers copy];
voteCounts = [someVoteCounts copy];
textItems = [items copy];
}
return self;
}

//make sure we deallocate the object when done
- (void)dealloc
{
self.users = nil;
self.voteCounts = nil;
self.textItems = nil;
[super dealloc];
}

//this is called when the window first loads
//we do initial window setup here
- (void)windowDidLoad
{
[view setTarget:self];
[view setDataSource:self];
[view setDoubleAction:@selector(bodydata)];
}

//this is called when the view controller is asked to show its window
//we load the table here
- (IBAction)showWindow:(id)sender
{
[super showWindow:sender];
[view reloadData];
}

- (NSInteger)numberOfRowsInTableView:(NSTableView*)aTable
{
return [users count];
}

- (id)tableView:(NSTableView*)aTable objectValueForTableColumn:(NSTableColumn*)aCol row:(NSInteger)aRow
{
if (aCol == voteCount)
{
return [voteCounts objectAtIndex:aRow];
}
else if (aCol == saidUser)
{
return [users objectAtIndex:aRow];
}
return nil;
}

- (void)bodydata
{
NSInteger index = [view selectedRow];
[body setString:[textItems objectAtIndex:index]];
}

@synthesize users;
@synthesize voteCounts;
@synthesize textItems;
@synthesize view;
@synthesize voteCount;
@synthesize saidUser;
@synthesize body;
@end

关于Cocoa 类不在 NSWindow 中显示数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2762185/

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