2017-03-11 3 views
0

몇 가지 내 프로젝트에서 나는 많은 경우에 훌륭한 구조를 만들지 못했다고 생각합니다.UIView 하위 클래스 액세스 ViewController 메서드 swift

8 * 8 셀 격자로 게임 보드 (체스 생각)를 만든 게임이 될 수 있습니다. 각 셀에는 상위 ViewController의 게임 로직과 함께 하위 클래스 (cell.swift)를 사용하는 제스처 인식기가 있습니다.

인수를 위해, 사용자가 어떤 사각형을 터치했는지 표시하고자합니다.

나는

UIApplication.shared.keyWindow?.rootViewController?.present(alertController, animated: true, completion: nil) 

(이 예제의 서브 클래스 UIView의/cell.swift에서 경고를 생성합니다. obvs) 서브 클래 싱에 UIView에서이 작업을 수행하는 방법을 발견했지만의 구조를 깰 것으로 보인다 응용 프로그램 -하지만 그것은 부모 ViewController에서 동작을 액세스하는 동일한되지 않을까요? 이것에 접근하는 최선의 방법은 무엇입니까>

답변

1

rootViewController는 스택 맨 아래에있는 VC입니다. 보이는 VC에 접근하는 것은 안전한 방법이 아니며 일반적으로 유용하지는 않습니다 (경우가 있지만 앱이 유용하다고 생각할 수는 없습니다).

대리석 패턴을 사용하려고합니다. 체스 보드를 표시하는 상위 VC (이 MyBoardViewController라고 부름)가 다음과 같은 프로토콜을 준수한다고 가정 해 보겠습니다. ,

weak var delegate : SquareAlertHandler? 

그리고 현재 사용하고 어떤 이벤트 핸들러 대체 :

protocol SquareAlertHandler { 
    func handleSquarePressed(sender : myView) 
} 

을 그리고 당신의 MYVIEW 클래스에 다음 속성을 추가 : MYVIEW는 체스 사각형에 사용하든 사용자 정의 UIView의 클래스 다음 (난 당신이 언론을 처리하기 위해 IB에있는 UIButton를 사용하고 있으리라 믿고있어, 임의로 콘센트라는 이름의 한 'didPress :')으로 지금

@IBAction didPress(sender : UIButton) { 
    delegate?.handleSquarePressed(self) 
} 

, 요에 프로토콜을 추가 당신이 MYVIEW 인스턴스를 만들 때마다, 대리자로 MyBoardViewController 인스턴스를 할당하고, 당신은 갈 수 있어요,

class MyBoardViewController : UIViewController, SquareAlertHandler { 

    ... ... ... 
    func handleSquarePressed(sender : myView) { 
     // Do something to handle the press, here, like alert the user 
    } 
    ... ... ... 
} 

그리고 마지막으로 : UR MyBoardViewController, 그리고 방법을 정의합니다.

신속한 문맹 퇴치 정도에 따라 혼동을 줄 수 있습니다. 적어도 클래스 이름을 일치시킬 수 있도록 코드를 추가하면 사물을 명확히하는 데 도움이됩니다.

+0

이것은 괜찮습니다. 프로토콜 및 위임자를 이해하고 있으며 일반 응답으로 남겨두면 다른 독자에게 유용 할 수 있습니다. 고마워요. 그냥 배우고 실제로 이런 유형의 (아주 사소한 것은 아니지만) 문제를 다루는 리소스를 찾는 것은 어렵습니다. – stevenpcurtis

+0

좋은 소식! 코딩 패턴은 언어를 자주 변경하거나 언어를 처음 사용할 때 어려워집니다. 행운을 비네. – dylanthelion

+0

한 가지 문제 - 이전에 대리인을 사용했으며 항상 대리인을 설정했습니다. 여기는 항상 무의미한 것처럼 보입니다 - 무슨 일이 벌어지고 있습니까? – stevenpcurtis

관련 문제