我正在开始我的第一个Cocoa项目。我有一个严重的(对我来说)但可能很容易的问题(对你来说)需要解决,我需要从哪里开始。
简短描述:我构建了一个类"PortConnection.h",当调用函数-listPorts时,它会将外部类(AMSerial.h)找到的所有端口写入数组。这是PortConnection.h 的代码
#import <Cocoa/Cocoa.h>
#import "AMSerialPortList.h"
#import "AMSerialPortAdditions.h"
#import "AMSerialPort.h"
@interface PortConnection : NSObject {
@private
AMSerialPort *port;
NSMutableArray *portArray;
}
- (void)listDevices;
@property (nonatomic, retain) NSMutableArray *portArray;
@property (nonatomic, retain) AMSerialPort *port;
@end
并遵循PortConnection.m
#import "PortConnection.h"
#import "AMSerialPortList.h"
#import "AMSerialPortAdditions.h"
#import "AMSerialPort.h"
@implementation PortConnection
@synthesize portArray;
@synthesize port;
- (void)listDevices
{
// get an port enumerator
NSEnumerator *enumerator = [AMSerialPortList portEnumerator];
AMSerialPort *aPort;
while ((aPort = [enumerator nextObject]))
{
// Add Devices to Array
[portArray addObject:[aPort bsdPath]];
}
}
到目前为止,它运行良好。现在我的问题
我在GUI中实现了一个tableView,用于显示上面调用的方法的结果。该文件名为"PortTableViewController.h",是我的TableView的数据源。
这是.h文件
#import <Foundation/Foundation.h>
#import "PortConnection.h"
@interface PortTableViewController : NSObject <NSTableViewDataSource> {
@private
IBOutlet NSTableView *portTableView;
}
@property (assign) IBOutlet NSTableView *portTableView;
@end
这是.m文件:
#import "PortTableViewController.h"
#import "PortConnection.h"
@implementation PortTableViewController
@synthesize portTableView;
#pragma mark -
#pragma mark TableView Delegates
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView{
PortConnection *portConnection = [[PortConnection alloc] init];
[portConnection listDevices];
return [portConnection.portArray count];
}
- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{
??????? I DO NOT HAVE A CLUE HOW TO ACCESS THE ARRAY IN PORTCONNECTION.M CORRECTLY
}
@end
问题:
1) 查看TableViewDataSourceDelegates时,如何正确访问PortConnection.m类中已填充的portArray。它似乎不像我那样工作。
2) 每次我想在tableviewdelegate方法中从Portconnection.h中检索数据时,是否必须从中创建一个Object?
我真的很感谢每一种帮助!我想学点什么。。我真的很感谢你的支持!谢谢为了帮助我,请不要犹豫。我真的很感激…
谢谢Sebastian
一个简单的修复方法是让表视图控制器声明一个包含PortConnection
实例的实例变量。该实例在-init
中创建并发送-listDevices
,它由表视图控制器中的所有方法使用(这意味着所有方法都引用同一个PortConnection
实例),并在-dealloc
中发布。
例如:
PortTableViewController.h
#import <Foundation/Foundation.h>
#import "PortConnection.h"
@interface PortTableViewController : NSObject <NSTableViewDataSource> {
@private
IBOutlet NSTableView *portTableView;
PortConnection *portConnection;
}
@property (assign) IBOutlet NSTableView *portTableView;
@end
PortTableViewController.m
#import "PortTableViewController.h"
#import "PortConnection.h"
@implementation PortTableViewController
@synthesize portTableView;
#pragma mark -
#pragma mark TableView Delegates
- (id)init {
self = [super init];
if (self) {
portConnection = [[PortConnection alloc] init];
[portConnection listDevices];
}
return self;
}
- (void)dealloc {
[portConnection release];
[super dealloc];
}
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView{
return [portConnection.portArray count];
}
- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{
return [portConnection.portArray objectAtIndex:row];
// or whatever behaviour provides an object value for the column/row
}
@end
如果不想在每个委托中创建字段,可以在PortConnection
中创建一个静态变量来保存数组。最初,阵列是nil
,在第一次调用以获取端口时,如果需要,可以创建列表。
在实现文件中:
static NSMutableArray *portArray;
+ (NSArray) listPorts {
if(portArray != nil)
return (NSArray *)portArray;
NSEnumerator *enumerator = [AMSerialPortList portEnumerator];
AMSerialPort *aPort;
portArray = [[NSMutableArray alloc] init];
while ((aPort = [enumerator nextObject])) {
// Add Devices to Array
[portArray addObject:[aPort bsdPath]];
}
}
当然,这取决于portArray更改的频率,如果经常更改,我可能每次都会生成它。
如果portArray为nil ,您也可以执行getPortArray,它会调用generatePortArray
您应该只需要一个PortConnection实例,但您的表视图控制器需要了解它。可能是PortTableViewController创建并拥有PortConnection对象,也可能是其他对象,如应用程序委托或其他控制器创建了它。
在前一种情况下,这是微不足道的。。。PortTableViewController创建PortConnection实例,因此它有一个对它的引用,并且可以访问它的portArray属性。
在后一种情况下,事情并不复杂:创建PortController的对象应该为PortTableViewController提供一个指向PortController的指针。然后PortTableViewController应该保留PortController并将指针隐藏在实例变量中,以便它可以根据需要访问portArray属性。