2011-09-18 5 views
2

다른보기로 nib 파일을 만들었습니다. 이 nib 파일을 웹 (예 : html)처럼 템플릿으로 사용할 계획이었습니다. 그래서, 실제 데이터로 채우기이 nib의 새 인스턴스를 만들 nib &의 또 다른 새 인스턴스를 만들 실제 데이터 등 채우기 ...iOS (재) 템플릿으로 NIB 사용

을하지만이 작업을 수행 할 때, nib 인스턴스는 같은 행동을하지 않습니다. 하나만 생성됩니다. 내가 놓친 게 있니? 이 방법으로 nib 파일을 사용해야합니까?

int yCoord = 0; 

    for(int i=0; i<[resultSet count]; i++) 
    { 
     [[NSBundle mainBundle] loadNibNamed:@"msgView" owner:self options:nil]; 
     UIView *tmpMsgView = [[UIView alloc] initWithFrame:CGRectMake(0, yCoord, msgView.view.frame.size.width, msgView.view.frame.size.height)]; 
     tmpMsgView   = msgView.view; 

     UILabel *senderLabel = (UILabel *)[tmpMsgView viewWithTag:1]; 
     [senderLabel setText:@"trial"]; 

     [self.view addSubview:tmpMsgView]; 
     [tmpMsgView release]; 
     yCoord += msg.view.frame.size.height; 

    } 

msgView은 (IB를 통해) nib 파일에 매여 너무이의 ViewController 클래스로 정의되는 nib 파일의 소유자 -

여기 내 펜촉 파일을 사용하려고 방법입니다.

답변

3

코드에서 동일한 인스턴스를 반복해서 추가하며 매번 새로운 인스턴스를 반복하지 않습니다.

UIView *testView = [[UIView alloc] init]; 
testView.backgroundColor = [UIColor blueColor]; 
for (int i=0; i<5; i++) { 
    testView.frame = CGRectMake(0.0, (i+1)*40.0, 200.0, 20.0); 
    [self.window addSubview:testView]; 
} 
[testView release]; 

for (int i=0; i<5; i++) { 
    UIView *testView = [[UIView alloc] init]; 
    testView.backgroundColor = [UIColor blueColor]; 
    testView.frame = CGRectMake(0.0, (i+1)*40.0, 200.0, 20.0); 
    [self.window addSubview:testView]; 
    [testView release]; 
} 

는 매우 다른 두 가지입니다. 첫 번째 사실은 실제로 거의 의미가 없으며 하나의 파란색 막대로 나타납니다. 두 번째 줄은 파란색 막대 5 개로 훨씬 더 의미 있고 결과가 큽니다.- 다음에서

모습, 모든 다른 색상으로 5 개 사각형을 만듭니다이 각각 사각형은 펜촉에서로드는 별도의 인스턴스 것을 설명하는 것입니다 : 우리가 할당하면, 지금

for (int i=0; i<5; i++) { 
    NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"aView" owner:self options:nil];   
    UIView *nibView = [nibObjects objectAtIndex:0]; 

    nibView.backgroundColor = [UIColor colorWithRed:(i+1)*0.14 green:(i+1)*0.11 blue:200.0 alpha:1.0]; 
    nibView.frame = CGRectMake(0.0, (i+1)*40.0, 200.0, 20.0); 
    [self.window addSubview:nibView]; 
} 

우리 이

을하는 데 도움이

NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"aView" owner:self options:nil];   
for (int i=0; i<5; i++) { 
    UIView *nibView = [nibObjects objectAtIndex:0]; 

    nibView.backgroundColor = [UIColor colorWithRed:(i+1)*0.14 green:(i+1)*0.11 blue:200.0 alpha:1.0]; 
    nibView.frame = CGRectMake(0.0, (i+1)*40.0, 200.0, 20.0); 
    [self.window addSubview:nibView]; 
} 

희망 : nibObjects 배열 한 번만 루프 전에, 우리는 다시 하나 개의 사각형됩니다 우리는 또 다시 같은 인스턴스를 추가한다는 점에서 동일한 문제를 가지고

0

코드에 메모리 관리 문제가 있습니다.

UIView *tmpMsgView = [[UIView alloc] initWithFrame:CGRectMake(0, yCoord, msgView.view.frame.size.width, msgView.view.frame.size.height)]; 사용자는 UIView를 할당/초기화하고 다음 줄에는 다른보기를 변수에 저장합니다. UIView에 대한 포인터가 손실되므로 메모리가 누수됩니다.

senderLabel을 사용하는 코드가 nib 파일에서 정의한 내용에 따라 작동 여부가 결정됩니다.

[tmpMsgView release];에서 당신은 소유하지 않은 것을 발표 할 것입니다 (포인터는 더 이상 당신이 할당/입력 한 UIView를 가리 키지 않습니다). 여기서 문제는 msgView을 어떻게 선언 하느냐에 달려 있습니다. 자신이 소유하고 있지 않은 객체를 릴리스하는 경우 할당이 취소 될 수 있으며 이로 인해 응용 프로그램에서 해당 객체가 표시되지 않을 수 있습니다.

0

당신이하려고하는 것은 괜찮습니다. 예를 들어 테이블 뷰 셀을로드하기 위해 일상적으로 수행되는 작업입니다.

이렇게하면보기 컨트롤러 (출력 한 파일 소유자로 설정)에서 하나의 콘센트가 있습니다. 이것은 펜촉의 맨 위에있는 객체입니다 (예 : UIView). 다른 모든 Nib 컴포넌트는이 서브 뷰일 뿐이며, 태그로 식별 할 수 있습니다. 또는 맨 위의 뷰가 사용자 정의보기 인 경우 적절하게 연결된 출력을 가질 수 있습니다.

loadNibNamed을 입력하면 콘센트 ivar이 맨 위에있는 객체로 설정됩니다. 그런 다음이를 메소드 레벨 변수에 할당하고 ivar을 nil로 다시 설정합니다. 그런 다음 다른 사람에게 하위보기로 추가하기 전에 원하는 내용을 수행 할 수 있습니다. 다음 번에 펜촉을 넣으면 새로운 버전이 나옵니다.

희망 사항은 의미가 있습니다. 다른 것을 추가 할 수 있는지 알려주세요. 코드의 문제는 최상위 수준 객체 대신 msgView.view를 사용하여 작업하고 있다는 것입니다.

관련 문제