Objective c 如何从表数据源访问数组?

Objective c 如何从表数据源访问数组?,objective-c,arrays,cocoa,class,import,Objective C,Arrays,Cocoa,Class,Import,我正在开始我的第一个可可项目。我有一个严重的(对我来说)但可能很容易解决的问题(对你们来说),我需要一些方向从哪里开始 简短描述:我构建了一个类“PortConnection.h”,当调用函数-listPorts时,该类将外部类(AMSerial.h)找到的所有端口写入数组。下面是PortConnection.h的代码 #import <Cocoa/Cocoa.h> #import "AMSerialPortList.h" #import "AMSerialPortAdditions

我正在开始我的第一个可可项目。我有一个严重的(对我来说)但可能很容易解决的问题(对你们来说),我需要一些方向从哪里开始

简短描述:我构建了一个类“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
到目前为止,它是完美的工作。 现在我的问题

我在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
问题:

1) 查看TableViewDataSourceDelegates时,如何正确访问PortConnection.m类中填充的portArray。它似乎不像我那样工作

2) 每次我想在tableviewdelegate方法中从Portconnection.h检索数据时,是否必须从该对象创建一个对象

我真的很感谢每一种帮助!我想学点东西。。我真的很感谢你的支持!谢谢为了帮助我,请不要犹豫。我真的很感激

谢谢
Sebastian

如果不想在每个委托中创建字段,可以在保存数组的
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,如果portArray为nil,则调用generatePortArray。如果您不想在每个委托中创建字段,则可以在保存数组的
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,如果portArray为nil,则调用generatePortArray。一个简单的修复方法是让您的表视图控制器声明一个实例变量,该变量包含一个
端口连接
实例。此实例是在
-init
中创建和发送的
-listDevices
,它由表视图控制器中的所有方法使用(这意味着所有方法都引用相同的
端口连接
实例),并在
-dealoc
中发布

例如:

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

一个简单的修复方法是让您的表视图控制器声明一个实例变量,该变量保存一个
PortConnection
实例。此实例是在
-init
中创建和发送的
-listDevices
,它由表视图控制器中的所有方法使用(这意味着所有方法都引用相同的
端口连接
实例),并在
-dealoc
中发布

例如:

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

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

在前一种情况下,它是微不足道的。。。PortTableViewController创建PortConnection实例,因此它具有对该实例的引用,并且可以随时访问其portArray属性


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

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

在前一种情况下,它是微不足道的。。。PortTableViewController创建PortConnection实例,因此它具有对该实例的引用,并且可以随时访问其portArray属性


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

我刚刚更改了问题标题。。。谢谢你,这是我的问题。。。然后它会是:
PortConnection*port=[[PortConnection alloc]init]
在每个委托方法的第一行吗?我刚刚更改了问题标题。。。谢谢你,这是我的问题。。。然后它会是:
PortConnection*port=[[PortConnection alloc]init]
在每个委托方法的第一行吗?非常感谢您的努力!你知道那种感觉,当你知道某件事应该如何运作,需要采取的一些步骤对你来说是完全清楚的,但你却不明白吗?:)那帮了大忙!谢谢非常感谢你的努力!你知道那种感觉,当你知道某件事应该如何运作,需要采取的一些步骤对你来说是完全清楚的,但你却不明白吗?:)那帮了大忙!谢谢
#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