2011-06-01 34 views
1

我开始我的第一个可可项目。我有一个认真的(对我来说),但也许是一个简单的问题(为你)解决,我需要一些方向从哪里开始。如何从我的表格数据源访问我的数组?

简短描述:我创建了一个类“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创建对象?

我非常感谢各种帮助!我想学习一些东西..我非常感谢你的支持!谢谢..为了帮助我的问题,请不要犹豫。我真的很感激....

感谢 塞巴斯蒂安

回答

0

如果你不想在每一个你能在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将如何经常变化,如果是经常,我可能只是产生它每一次。

你也可以做一个getPortArray这就要求generatePortArray如果portArray是零

+0

我刚刚更改了问题标题......谢谢 – konturgestaltung 2011-06-01 23:51:32

+0

这就是我的问题......它会是: 'PortConnection * port = [[PortConnection alloc] init]' 在每一行的第一行委托方法? – konturgestaltung 2011-06-01 23:52:32

1

一个简单的解决方法是让你的表视图控制器声明持有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 
+0

非常感谢你的努力!你知道这种感觉,当你以某种方式知道应该如何工作并且需要一些步骤对你来说完全清楚时,但是你没有得到它? :)这帮了很多!谢谢!!! – konturgestaltung 2011-06-02 07:08:54

0

你应该只需要一个PortConnection实例,但你的表视图控制器不知何故需要知道它。可能是PortTableViewController创建并拥有PortConnection对象,也可能是其他某个对象,如应用程序委托或其他控制器创建它。

在前一种情况下,它是微不足道的... PortTableViewController创建PortConnection实例,因此它有一个对它的引用,并且可以很好地访问它的portArray属性。

在后一种情况下,事情并不复杂得多:创建PortController的对象应该给PortTableViewController一个指向PortController的指针。 PortTableViewController应该保留PortController并将指针存放在一个实例变量中,以便它可以根据需要访问portArray属性。

+0

非常感谢您的建议!我真的向前迈了一步...... – konturgestaltung 2011-06-02 07:09:24

相关问题