2013-05-18 3 views
0

Ok - 여기에 무슨 일이 일어나고 있는지 이해할 수 없습니다. 나는 간단한 카드 게임을 만들고있다. 나는 "Card"가 있어야하는 모든 것들을 다루는 UIView의 Category를 만들었습니다. 나는 이것이 무의미하다고 생각하지만, 그렇지 않을 수도 있습니다.NSMutableArray의 객체에 속성 설정

어쨌든 내보기 컨트롤러에서 상인과 플레이어의 손을 잡기 위해 2 NSMutableArrays 만 만들었습니다. 그런 다음 카드 값을 설정하는 방법을 호출합니다. 이 방법에서는 NSLog를 사용하여 특정 카드 객체의 가치를 확인합니다. 하지만 내 View Controller에서 그 값을 얻으려고하면 배열의 마지막 객체 값을 가진 모든 객체에 대해 항상 돌아옵니다.

일부 코드 : 나는 setCardValue을 (이 범주 내에) 호출 한 후 NSLog를 얻을 때

playersCards = [[NSMutableArray alloc] initWithObjects:[[UIView alloc] init],[[UIView alloc] init],nil]; 

[[playersCards objectAtIndex:0] setCardValue]; 
[[playersCards objectAtIndex:1] setCardValue]; 

NSLog(@"1: %i",[[playersCards objectAtIndex:0] returnValue]); 
NSLog(@"2: %i",[[playersCards objectAtIndex:1] returnValue]); 

그래서 - 다시, 모두 괜찮습니다. 그러나 NSLog는 바로 거기에 있습니다. 둘 다 인덱스 1의 값을 반환합니다. 여기 무슨 일 이니?

+0

"카테고리를 만들었습니다 ..."카테고리 란 무엇입니까? "나는 2 개의 NSMutableArrays를 만들고 있습니다."players players는 하나입니다. 다른 무엇입니까? 상황이 합산되지 않습니다. –

+0

내가 가장 잘 이해하고있는 것처럼, 카테고리는 본질적으로 기존 클래스를 확장합니다. 이 경우에는 "카드"에 필요한 모든 데이터 (값과 슈트)를 저장하기 위해 데이터를 생성합니다. 또한이 데이터를 재생에 "처리"하고 뒤집을 수있는 메소드가 있습니다.이 배열의 다른 배열은 앱은 위에서 언급 한 playersCards 배열과 동일하지만 딜러 만 사용할 수 있습니다. 기본적으로 같은 방식으로 작동해야하기 때문에 위의 코드에 포함시키지 않았습니다. 다른 카드 세트 만 잡으십시오. – tnd

답변

4

setCardValue 메쏘드가 당신이 뭔가 복잡한 것을하지 않는 한 카드가있는 색인을 알 수있는 방법이 없습니다. 따라서 두 개의 카드를 가지고 있지만 동일하게 초기화되어있을 가능성이 큽니다.

그러나 여기에는 더 큰 문제가 있습니다. 이와 같이 데이터로 UIView 인스턴스를 사용하고 싶지는 않습니다. 화면 [View]에서 물건을 렌더링하는 비트를 게임 [모델]의 상태를 유지하는 비트와 분리하려고합니다. 일반적으로 뷰 [컨트롤러]와의 사용자 상호 작용을 기반으로 모델 상태를 관리하는 계층이 있습니다.

자세한 내용은 Model-View-Controller에 대한 설명서를 참조하십시오. 카테고리와 기존 클래스의 오프


매달려 물건을 편리하게 보일지도 모르지만, 정말 응용 프로그램에서 데이터, 상태 및/또는 로직을 캡슐화 기본 패턴으로 사용할 수 없습니다.

정말로 [게임 상태] 데이터가 화면 [뷰]에서 그려지는 방식과 격리되어 있어야합니다.

귀하의 코멘트에서 특정 질문의 측면에서

, 또 다른 질문 :

상상 코드는 다음과 같이 기록 된 것을 :

Card *c = [cardArray objectAtIndex: 0]; 
[c doSomething]; 

어떻게 c가 그 코드에 어떤 인덱스 알아? 이제이 코드는 [[cardArray objectAtIndex:0] doSomething];과 동일합니다. 단순히 양복과 값을 저장

  • Card 클래스 :

    나는 카드 게임의 일종을 설계 할 경우에, 나는 가능성이 클래스의 소수를 만들 것입니다. 아카이브 목적으로 NSCoding을 지원합니다.

  • 소송과 가치 부여, 카드를 렌더링하는 방법을 알고, UIViewCardView 서브 클래스입니다.

  • GameFieldView 및 운동장 (구, UIView 하위)를 그리는 방법을 인식하고있는 클래스를 어떻게 운동장에 대한 CardViews를 이동하는 방법의 GameFieldController 세트 (후자하는 UIViewController에) 추가 GameFieldController

  • 특정 서브 클래스 손, 스택, 말뚝 및/또는 카드 게임을 만드는 데 필요한 다른 것들을위한 논리.

.... 등등 ....입니다

, 내가 iOS 또는 OS X의 모델 뷰 컨트롤러 패턴에 맞는 일련의 클래스들로 게임을 깰 것 같은 나는 그 최소한의 코드를 작성하고 시스템이 무거운 짐을 들게하도록 설계되었습니다.

과도한 것처럼 보일 수 있습니다. 모든 클래스와 모든 클래스에는 무엇이 있지만 실제로는 개별 클래스가 비교적 간단하고 유연합니다.

+0

답변 해 주셔서 감사합니다. 나는 여전히 Obj-C에 대해 아주 새로운데, 그래서 나는이 작은 프로젝트에 접근하는 최선의 방법을 찾아 내려고 노력 중이다. 어쨌든 UIView로 표현되어야하는 각 카드의 시각적 측면을 처리 할 수있는 좋은 방법은 UIView에서 카테고리를 만드는 것입니다 (오른쪽 또는 아님?) 및 모든 세부 사항 (값, 수트, 애니메이션, 등) 카테고리에 - 내가이 만날 때까지 멋지게 작동했다. 특정 인덱스에서 객체를 참조 할 경우 왜 값을 설정할 색인을 알 수 없습니까? 당신의 도움을 주셔서 감사합니다. :) – tnd

+0

지금 당신이 말하는 것을 완전히 얻으세요. 여기서 내 디자인 패턴을 다시 방문해야합니다. 당신의 도움을 주셔서 감사합니다! 건배! – tnd

관련 문제