【问题标题】:How do I access my array from my table data source?如何从我的表数据源访问我的数组?
【发布时间】:2011-09-06 17:27:58
【问题描述】:

我正在开始我的第一个 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 创建一个对象?

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

谢谢 塞巴斯蒂安

【问题讨论】:

    标签: objective-c arrays cocoa class import


    【解决方案1】:

    如果您不想在每个委托中创建一个字段,您可以在 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 *port = [[PortConnection alloc] init] 在每个委托方法的第一行吗?
    【解决方案2】:

    一个简单的解决方法是让您的表视图控制器声明一个包含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
    

    【讨论】:

    • 非常感谢您的努力!你知道那种感觉,当你不知何故知道某事应该如何工作以及需要的一些步骤对你来说是完全清楚的,但你不明白吗? :) 这有很大帮助!谢谢!!!
    【解决方案3】:

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

    在前一种情况下,这很简单...... PortTableViewController 创建了 PortConnection 实例,因此它具有对它的引用并且可以访问它的 portArray 属性。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      • 2023-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多