2016-07-11 1 views
0

이미 존재하는 iOS 개체와 함께 위임을 사용하는 방법을 알고 있습니다. 예를 들어, UITableView의 인스턴스를 만들고 뷰 컨트롤러가 UITableView 대리자를 준수하면 UITableView 대리자의 다양한 메서드를 구현할 수 있습니다. 예를 들어, didSelectRowAtIndexPath가 호출 될 때 새로 만든 테이블에서 알림을받을 수 있습니다.iOS 대표단은 실제로 어떻게 작동합니까?

내 질문에 내 테이블에서이 특정 대리인 콜백을 얻은 이유가 무엇입니까? 제 생각에 대표는 구현되지 않은 메서드 목록 일뿐입니다. 그것은 나에게 많은 일이 계속 일어나고있는 것처럼 보입니다. 정말로 "뒤에서"무슨 일이 벌어지고 있습니까?

이미지 나는 다음에 모든 대리자 메서드의 이름을 변경하는 경우 : - mysteryMethod1 - mysteryMethod2 - mysteryMethod3을 ... 등 이러한 방법 중 하나는 특정 인덱스에서 행의 높이를 설정하기위한 책임이 있습니다. 또 다른 방법은 특정 행을 편집하는 것입니다.

위임에 대해 읽은 모든 항목은 위임자가 위임자와 계약을 맺습니다. 대리인은 메서드를 구현할 것을 약속합니다. 그럴 때, 어떻게 든 모든 것이 올바르게 연결되고 모든 것이 마술처럼 작동합니다. 내가 보지 못하는 마법은 무엇인가?

+1

대리인이 작동하는 방식을 설명하는 수천 개의 자습서가 있습니다. 임의의 설명 중 하나를 사용할 수 있습니다. [여기] (https://www.natashatherobot.com/explaining-ios-delegates-a-story-about-your-morning-coffee/). – holex

답변

0

저는 대리인이 실제로 어떻게 작동하는지 알기 위해서 먼저 자신 만의 사용자 지정 위임을 만들어야한다고 생각합니다. 그런 식으로 마술은 보이지 않을 것입니다. 실제 사과의 구현을 볼 수는 없습니다. 대리자 메서드를 작성하지만 많은 논리가 구현되어 있지만 개인 정보 보호 측면에서 사용할 수는 없다고 확신합니다. 당신이 당신의 지정 대리인의 예를 들어 봅시다 ...

을 만들 때 당신은 클래스 A가이 클래스에서, 당신은이 같은 위임 속성이이 클래스에서 프로토콜

protocol ClassADelegate: class { 
func changeBackgroundColor(_ color: UIColor?) 
} 

를 작성하여 시작 .

weak var delegate: ClassADelegate? 

은의이 클래스가의 ViewController이고 당신이있는 UIButton처럼 상에 IBAction를이 있고, 당신의 목표는 당신이 버튼을 누를 때 앱에 다른의 ViewController는 파란색의 배경 색상을 변경할 수 있다는 것을 가정 해 봅시다. 이렇게 클래스 A에서이 작업 ...

func someAction() { 
delegate?.changeBackgroundColor(.blue) 
} 

내부 은의 당신이 jQuery과를 사용하여 대리자 생각하는 경우 "마법"jQuery과 수업이라고 생각하는 방식에 의해, 클래스 A 여기에서 발생한다고 가정 해 봅시다 A.

이제는 색상을 바꿀 클래스 B가 있습니다. 그럼 이제 클래스 B는 또한 프로토콜을 준수처럼,이 같은 프로토콜을 준수 할 필요가 UITableViewDelegate 등

class ClassB: UIViewController, ClassADelegate { 
} 

이제 두 번째의 단어 위임 생각하고, 당신은 단지 의미 어떻게 생각 책임을 다른 사람에게 위임 한 거지? 예,이 경우 ClassB는 위임 된 것입니다. 클래스 B에 클래스 A의 인스턴스가 있어야만 대리자 속성에 액세스 할 수 있습니다.

let classa = ClassA() 
classa.delegate = self 

최종 단계는 다음과 같은 프로토콜의 메소드를 호출하는 것입니다.요 클래스에서이 방법을 볼 수 있지만 당신이 프로토콜의 구현, 당신이 자신을 묻습니다에 액세스 할 수없는 경우

func changeBackgroundColor(_ color: UIColor?) { 
view.backgroundColor = color 
} 

은 결론적으로 "이 마법의 색상에서 오는 않습니다를?" 그러나 프로토콜을 속한 다른 클래스에서 온 것처럼 보았으므로 이것이 도움이되기를 바랍니다.

관련 문제