Objective-c의 테이블에 행을 추가합니다
-
22-07-2019 - |
문제
나는 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 ++;
}
나는이 것들에 대해 많이 읽었지만 이것은 너무 힘들어야하는 것처럼 보이지 않습니다. 또한 주요 문제는 "배열"에 하나의 색인 만 있고 사용자가 다른 것을 추가하려고 할 때 앱 충돌을 일으킨다는 것입니다.
누군가 나를 도와주고 내가 무엇을 잘못하고 있는지, 어떻게 제대로 할 수 있는지 말해 줄 수 있습니까? 제발! ... 아니면 올바른 방향으로 나를 가리겠습니까?
해결책
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의 Getter가 자동 엘리트 또는 할당되었다고 가정함에 따라).
이렇게하면 Crasher가 수정됩니다. 또한 언제든지 전화 할 수 있습니다
[array addObject:nameOfConfig];
배열 끝에 객체를 자동으로 추가하므로 인덱스 변수를 제거 할 수 있습니다. 그러나이 두 번째 부분을 변경하면 버그를 숨기고 새 구성이 이전 구성을 대체한다는 것이 더 신비하게 만듭니다.
다른 팁
nsmutablearray의 -addobject : insertobject 대신 메소드를 사용하는 것이 훨씬 간단하지 않습니까? 추가 변수 (configlistdataindex)를 사용하는 이유는 무엇입니까?
[array addObject:nameOfConfig];
self.configListData = array;
[array release];
그리고 그게 다야.
그리고 나는 그것이 왜 충돌하는지 알고 있다고 생각합니다 ... 당신은 항상 새로운 배열 객체를 만들고, 항상 새로운 빈 배열의 다른 위치에 "nameofconfig"를 삽입 할 때마다. 그로 인해 configlistData는 항상 하나의 객체 만 갖습니다. configlistData를 직접 편집하는 것이 훨씬 나아지지 않습니까?