2012-12-05 4 views
0

테이블보기에 나타나는 항목 목록이 있습니다. 모든 항목의 이름, 사진, 순위 등의 속성이 있습니다. ' 목표는 사용자가 행을 선택할 때마다 속성이있는 항목이 새 목록에 추가된다는 것입니다.개체 배열 내부의 개체 속성 액세스

listOfBugs이라는 새로운 목록을 만들었습니다. 전역으로 지정하기 위해 viewDidLoad에 할당하고 초기화했습니다. (적절한 일을 할인가요?) 여기

내 코드입니다 : 나는 것을 볼 수 있습니다 NSLog를 사용

MasterViewController.h

@interface MasterViewController : UITableViewController 
{ 
    NSMutableArray *listOfBugs; 
} 
@property (strong) NSMutableArray *bugs; 

MasterViewController.m

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    listOfBugs = [[NSMutableArray alloc]init]; 
    self.title = @"Scary Bugs"; 
} 
... 
... 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    ScaryBugDoc *bug = [self.bugs objectAtIndex:indexPath.row]; 

    UIAlertView *messageAlert = [[UIAlertView alloc] 
           initWithTitle:@"Row Selected" message:bug.data.title delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 

    [messageAlert show]; 
    [listOfBugs addObject:bug]; 
    NSLog(@"this is %@",listOfBugs); 

} 

객체가 추가되었습니다.

ScaryBugs[1195:11303] this is <ScaryBugDoc: 0x75546e0> 
2012-12-05 17:45:13.100 
ScaryBugs[1195:11303] this is <ScaryBugDoc: 0x75546e0> 

몇 가지 질문이 있습니다.

1. 배열 listOfBugs 내부의 객체 속성에 어떻게 액세스 할 수 있습니까?

업데이트 :이 나를 위해 일한은 :

NSLog(@"this is %@",((ScaryBugDoc *)[listOfBugs objectAtIndex:0]).data.title); 

하지만 다른 클래스에서 listOfBugs에 액세스 할 수 없습니다.

필자는 내 인생을 더 쉽게 만들어 줄 수있는 속성으로 바꾸었지만 다른 클래스에서는 여전히 액세스 할 수 없습니다. listOfBugsViewController.mreturn [_listOfBugs count]; 예는 나에게 내가 그렇게 할 수있는 방법 '_listOfBugs'

2.I는 사용자 정의 목록 테이블보기를 채울 abale되고 싶어 선언되지 않은 식별자의 오류 사용을 줄 것이다 들어?

필자는이 목록을 plist로 저장하고 안심하고 오브젝트를 추가 및 제거하므로이 작업을 고려해야합니다.

This is the code that I'm based on, I only made a few adjustments to create the new list

+0

원하는 개체의 형식 인 temp 개체를 만들지 않고 값을 objectAtIndex :로 설정하고 속성을 사용 할 수 있습니까? – CBredlow

+0

나는 당신을 쫓을 지 모르겠다.하지만 음악 앨범 목록을 갖고, 모든 앨범에 노래 목록이 있으며, 모든 노래는 그 속성을 가졌다. 사용자는 앨범의 노래를 선택하여 새 노래 목록을 만들 수 있습니다. – Segev

+0

"하지만 작동하지 않습니다"는 실제로 무슨 뜻입니까? –

답변

2

이 정말 두 가지 질문입니다 :

1) 나는 내 재산을 다른 클래스에서 액세스 할 수있는 공용 속성 어떻게해야합니까?

bugs 속성과 마찬가지로 수행합니다. 당신의 .H 파일이 추가 :

@property (strong) NSMutableArray *newList; 

참고 서로 다른 스레드를 사용하지 않는 경우, 당신은뿐만 아니라 (@property (nonatomic, strong))을 nonatomic 속성을 사용하여 좀 더 효율적으로 만들 수있다.

일단 그렇게하면 자동으로 생성되므로 iVar 선언이 필요하지 않습니다. (즉, NSMutableArray *newList;을 삭제할 수 있습니다.)

2) 배열의 객체에 액세스하려면 어떻게해야합니까?

배열의 개체는 id 개체로 저장됩니다.이 개체는 "일반"개체라는 의미입니다. 어떤 유형의 객체가 저장되어 있는지 알고 있다면 컴파일러에게 그 클래스에 적합한 속성과 메소드가 무엇인지 알 수 있도록 컴파일러에 알려야합니다. 이 같은 (위의 점 1에 덮여로)가 공개되어 가정, 그리고

ScaryBugDoc *bug = (ScaryBugDoc *)[self.newList objectAtIndex:0]; 

, 당신은 객체의 속성에 액세스 할 수 있습니다 : 당신은 올바른 유형에에게 변수를 캐스팅 하여이 작업을 수행 할

NSLog(@"this is %s", bug.data.tile); 
+0

어떤 이유로 newList를 속성으로 사용하면 시맨틱 문제가 발생합니다. 속성의 합성 된 getter는 '소유 된'객체를 반환하기 위해 Cocoa 명명 규칙을 따릅니다. "그래서 지금부터는'listOfBugs'라고합니다. . 속성으로 바꾸었지만 다른 클래스에서 액세스 할 수 없습니다. 예를 들어,'listOfBugsViewController.m'에서'return [_listOfBugs count];를 리턴합니다. '선언되지 않은 식별자'_listOfBugs''를 사용하면 오류가 발생합니다. – Segev

+0

"당신은 iVar 선언 ... 즉 NSMutableArray * listOfBugs를 제거 할 수 있습니다. " 어떤 코드를 제거 할 수 있습니까? – Segev

+0

죄송합니다. 새로운 객체를 생성하고 반환하지 않는 한 새로 시작할 수 없습니다. '_listOfBugs' 대신'listOfBugs'를 사용해보십시오. 그리고 제거 할 수있는 줄은 .h 파일의 두 번째 줄입니다 (중괄호는 포함하지 않습니다). – lnafziger

0

좋아, 코멘트에서 기반이 작동합니다 :

Album* tempAlbum = [albumList objectAtIndex:i]; 
//now you can access album's properties 
Song* tempSong = [album.songs objectAtIndex:j]; 
//now you can access song's properties 

이 아래로 단순화 할 수 있습니다있는 NSArray에서 개체를 반환 할 때

Song* someSong = [((Album)[albumList objectAtIndex:i]).songs objectAtIndex:j]; 

, 또는 일반 객체를 반환하는 컬렉션 객체. 적절한 개체에 액세스 할 수 있도록 예상 개체에 형식 변환해야합니다.