2013-03-18 5 views
2

나는 C로 쓴 프로그램을 변환하려고하여 Objective C를 배우려고합니다.이 프로그램은 큰 2 차원 배열과 함께 작동하므로 계산이 필요합니다. UI에 테이블 형식으로 2D 배열을 표시 할 수 있어야합니다. 내가 할 수있는 최선의 방법은 C- 스타일 배열을 NSMutableArrays 행으로 변환 한 다음 NSTableView에 전달할 "행 스택"으로 다른 NSMutableArray에 "행"NSMutableArrays를 저장하는 것입니다. (더 좋은 방법이 있다면 알려주세요.)NSTableView에 2D 배열 표시

문제는 arrayOfArrays에 저장할 수 없다는 것입니다. 그냥 null입니다. 나는 어리석은 멍청한 놈 오류를 만들고 있다고 확신하고 나는 그것이 생성자를 호출하는 방식과 관련이 있다고 생각하지만, 나는 그것을 이해할 수 없다.

여기 내 코드입니다 :

int grid[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; 

NSMutableArray *arrayOfArrays; 


int x=0; 

-(void)awakeFromNib 
{ 
    NSMutableArray *array1 = [[NSMutableArray alloc]init]; 
    NSMutableArray *array2 = [[NSMutableArray alloc]init]; 
    NSMutableArray *array3 = [[NSMutableArray alloc]init]; 


    for (int y=0; y < 3; y++) { 
     [array1 addObject:[NSNumber numberWithInt:grid[x][y]]]; 
    } 

    x++; 
    for (int y=0; y < 3; y++) { 
     [array2 addObject:[NSNumber numberWithInt:grid[x][y]]]; 
    } 

    x++; 
    for (int y=0; y < 3; y++) { 
     [array3 addObject:[NSNumber numberWithInt:grid[x][y]]]; 
    } 

    [arrayOfArrays addObject:array1]; 
    [arrayOfArrays addObject:array2]; 
    [arrayOfArrays addObject:array3]; 

} 

- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView 
{ 
    return [arrayOfArrays count]; 
} 

- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn  *)aTableColumn row:(NSInteger)rowIndex 
{ 
    return [arrayOfArrays objectAtIndex:rowIndex]; 
} 

@end 

아, 그리고이 객체는 NSTableViewSource이며이 NSTableView는 대한은 dataSource입니다.

답변

0

arrayOfArrays이 인스턴스 변수라고 가정합니까? 그렇다면 네,보고있는 문제는 항목을 추가하기 전에 arrayOfArrays을 초기화 (생성)하지 않았기 때문에 발생합니다. 당신이 awakeFromNib에서이 작업을 수행 할 수 있지만 당신은 ARC를 사용하지 않는 경우

, 나는 보통 init에서 작업을 수행하고, 함께 initarrayOfArrays의 생성을 균형 releasedealloc에서 :

- (id)init { 
    if ((self = [super init])) { 
     arrayOfArrays = [[NSMutableArray alloc] init]; 
    } 
    return self; 
} 

- (void)dealloc { 
    [arrayOfArrays release]; 
    [super dealloc]; 
} 

때를 Objective-C에서 개체를 초기화 (init*)하면 인스턴스 변수는 기본 형식의 경우 0으로, Objective-C 개체의 경우 nil으로 자동 설정됩니다. 원래 코드에서 [arrayOfArrays addObject:array1];과 같은 줄은 기본적으로 [nil addObject:array1];과 같습니다. 즉, nil으로 메시지를 보냅니다. 이는 Objective-C에서 허용되며 결과는 메시지가 단순히 무시된다는 것입니다. numberOfRowsInTableView: 메서드는 return [nil count];으로 "해결"되어 0을 반환하므로 tableView:objectValueForTableColumn:row: 메서드를 호출하는 데 신경 쓰지 않아도됩니다. 호출 된 경우에도 nil을 반환합니다.

+0

감사합니다 !! 이 질문은 내 원래 질문에 대한 답변입니다. –

0

귀하의 초기 배열입니다 : 이제 데이터 원본으로 arrayOfArrays을 사용할 수 있습니다

NSMutableArray *arrayOfArrays=[NSMutableArray new]; 
for(int i=0;i<3;i++){ 
    for(int j=0;j<3;j++){ 
     [arrayOfArrays addObject:grid[i][j]]; 
    } 
} 

:

int grid[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; 

당신은에 의해 한 dimentional 배열을 만들 수 있습니다.

편집 :

는 표현의 이런 종류의 당신을 위해 잘 될 것입니다 것인가? 당신이 할

enter image description here

+0

나는 그것이 나를 위해 일할 것이라고 생각하지 않습니다. NSTableView를 이해하면 1 차원 배열을 플로팅하면 나에게 9 개의 행이 주어지며 3 개의 행이 3 개 필요합니다. (NSTableView를 포맷하는 다른 방법이 없다면) 그리고 어떤 데이터라도 받아들이려면 * arrayOfArrays를 얻을 수 없습니다. –

+0

방금 ​​원래의 ​​게시물을 다시 읽었습니다. 문제는 arrayOfArrays에 저장할 항목이 없다는 것입니다. 나는 "t"를 그만 뒀다. –

+0

내 편집을 확인하십시오. 여기에 2D 배열이 있습니다. A에는 2Kids, 사과, 비행기 및 두 번째 한 contais 2kids, 공, .baloon이 포함되어 있습니다. –

0

객체에 C 배열을 변환 할 필요가 없습니다. 당신이 단지 그것을하고 싶지 않다면 그것은 엄청난 불필요한 노력이 될 수 있습니다. Objective-C의 교훈 중 하나는 C가 여전히 사용되고 적절하게 사용되고 있다는 것입니다. 모든 것은 이 아니며 개체 여야합니다. : D

테이블 뷰 데이터 소스 방법을 사용하여 작업을 수행 할 수 있습니다.

tableView:objectValueForTableColumn:row:하고 numberOfRowsInTableView: 구현에서

numberOfRowsInTableView:, 그냥 당신이 행에 사용할 배열 차원의 요소의 수를 돌려줍니다.

tableView:objectValueForTableColumn:row: 구현에서는 배열 요소 값을 NSNumber 개체 나 NSString 개체로 입력 한 다음 해당 개체를 반환 할 수 있습니다. (NSNumber 리터럴은 여기에서 매우 유용 할 것입니다.)

유일한 불편한 점은 배열 차원 중 하나의 요소 수에 따라 프로그래밍 방식으로 테이블의 열 수를 결정할 수 있습니다. 필요에 따라 테이블 열을 추가하거나 제거하십시오. 코드에서 테이블 뷰를 작성하는 데 좋은 방법을 제공합니다. 일부 표보기를 이해하는 데 도움이됩니다.

글쎄, 당신은 여전히 ​​C 배열의 크기를 알기 위해 그것을 만들 때 그것을 끝내는 것을 피하기 위해 ... (C 함정 ...)

+0

감사합니다. 당신은 저에게 원래하는 일을하는 더 좋은 방법을주었습니다. –