如何从表数据源访问我的数组?

时间:2011-06-01 23:39:09

标签: objective-c arrays cocoa class import

我正在开始我的第一个可可项目。我有一个严肃的(对我而言),但也许很容易解决问题(对你而言),我需要一些方向从哪里开始。

简短说明:我已经构建了一个类“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?

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

由于 塞巴斯蒂安

3 个答案:

答案 0 :(得分:1)

一个简单的解决方法是让表视图控制器声明一个包含PortConnection实例的实例变量。此实例在-listDevices中创建并发送-init,它由表视图控制器中的所有方法使用(这意味着所有方法都引用相同的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

答案 1 :(得分: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改变的频率,如果经常我可能每次都会生成它。

如果portArray为nil,您还可以执行调用generatePortArray的getPortArray

答案 2 :(得分:0)

您应该只需要一个PortConnection实例,但您的表视图控制器将以某种方式需要了解它。可能是PortTableViewController创建并拥有PortConnection对象,或者可能是某个其他对象,如app delegate或其他控制器创建它。

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

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