2009-09-18 2 views
0

나는 objective-C가 처음인데 테이블에 새로운 행을 추가하는 데 많은 어려움을 겪고 있습니다. 앱이로드 될 때 사용자가 원할 때마다 새로운 구성을 시작하거나, 저장된 구성을로드하거나, 마지막 구성을 다시 시작하도록 경고하는 팝업 창이 나타납니다. 이제 새 구성 시작을 선택하면 새 이름을 입력하라는 메시지가 표시되고 완료되면 탭에서 새 구성을 저장합니다.Objective-C의 테이블에 행 추가하기

지금은 앱이 테이블에 하나의 구성 만 저장할 수 있지만 사용자가 다른 새로운 구성을 만들려고 시도하면 앱이 다운됩니다. 나는이 물건에 대해 많이 읽고있다하지만 너무 열심히해야처럼이 보이지 않는다

- (IBAction) testToAddToList 
{ 
    nameOfConfig = @"Test Name"; //this just bypasses the user from having to enter a name 

    NSMutableArray *array = [[NSMutableArray alloc] init]; 

    [array insertObject:nameOfConfig atIndex:configListDataIndex]; 

    self.configListData = array; 

    [array release]; 

    configListDataIndex ++; 
} 

: 여기처럼 내 코드는 모습입니다. 또한 주요 문제는 "배열"에는 하나의 색인 만 있고 사용자가 응용 프로그램 충돌을 일으키는 다른 색인을 추가하려고 할 때입니다.

누군가 나를 도우 려하고 내가 뭘 잘못하고 있으며 어떻게 할 수 있는지 말해 줄래? 제발 ... 아니면 그냥 올바른 방향으로 나를 가리키고 있을까요?

+0

어떻게 작동이 중단됩니까? 오류가 무엇이고 해당 행에서 앱이 무엇을하고 있습니까? – Mark

답변

2

Woofy에 언급 된 것처럼 문제는 이전에 생성 된 배열을 잡는 대신 매번 새로운 배열을 생성한다는 것입니다.

[array insertObject:nameOfConfig AtIndex:0]; 

하지만 다음 번에

, 당신은 새로운 (빈) 배열을 생성하고 호출하도록 configListDataIndex 변수는, 지금 1 : 그래서, 당신은 배열에 추가 처음으로, 당신은 기본적으로하고 있습니다

[array insertObject:nameOfConfig atIndex:1]; 

및 1, 빈 배열의 범위를 벗어 났으므로 충돌이 발생합니다.

NSMutableArray *array; 
if (self.configListData != nil) // I know, unnecessary, but I like being explicit with my nil checks. 
    array = self.configListData; 
else 
    array = [NSMutableArray array]; 

그리고 (나는 configListData에 대한 게터는 오토 릴리즈되어 가정으로, 또는 지정) 함수의 마지막에 공개하지 않습니다이 문제를 해결하려면 뭔가를 할 수 있습니다.

이렇게하면 크래셔가 수정됩니다. 또한 언제든지

[array addObject:nameOfConfig]; 

과 같이 자동으로 개체를 배열 끝에 추가하여 색인 변수를 제거 할 수 있습니다. 하지만이 두 번째 부분을 변경하면 버그를 숨기고 크롤러를 먼저 고쳐야하며 새로운 구성이 이전 구성을 대체한다는 사실을 더욱 신비하게 만듭니다.

+0

대단히 감사합니다. 내가 필요한 것입니다 !! – Jeff

2

insertObject 대신 NSMutableArray의 -addObject : 메서드를 사용하는 것이 훨씬 간단하지 않습니까?

[array addObject:nameOfConfig]; 
self.configListData = array; 
[array release]; 

을하고 그것 뿐이다 : nameOfConfig을 : 별도의 변수 (configListDataIndex)를 사용하여 귀찮게 왜 당신은 단순히 addObject를 사용할 수있을 때.

그리고 나는 그것이 왜 깨지는 지 알고 있다고 생각합니다. 항상 새로운 배열 객체를 만들고 항상 새로운 빈 배열의 다른 위치에 "nameOfConfig"를 삽입합니다. 그리고 그 때문에, configListData는 항상 하나의 객체만을 가지고 있습니다. configListData를 직접 편집하는 것이 더 낫지 않습니까?

+0

대단히 감사합니다! – Jeff

관련 문제