-
20-08-2019 - |
문제
Objective-C로 프로그래밍하고 Xcode를 사용하고 있습니다. 나는 Apple 웹 사이트의 문서를 읽고 대의원의 것이 무엇인지 이해했지만 실제로 대의원 방법을 코드로 구현하는 방법에 대해 이야기하는 부분에 올 때, 특히 "이제 대의원의 구현을 구현할 때 혼란스러워집니다. 방법." 어쩌면 그것은 단지 나 일지 모르지만, 나는 방법을 어디에서 구현 해야하는지 정확히 알지 못합니다 (AppDelegate.h/.m 파일은 viewController와 AppDelegate 클래스 만있는 간단한 상황에서 올바른 위치일까요?). 진정으로 배우는 가장 좋은 방법은 매우 간단한 예를 보는 것입니다.
아래에 몇 가지 코드가 있었는데 누군가가 통과 할 수 있는지 궁금해하고 대의원을 ViewController에 연결하여 합계를 표시하는 방법을 보여줍니다. 코드가 길어 보이면 죄송하지만 이것이 내가 생각할 수있는 가장 간단한 대표 예입니다. 인수를 위해 볼 수있는 코드가 적을수록 (무슨 일이 일어나고 있는지 확인할 수 있도록) ServerClass *서버가 서버를 구현하고 ClientClass *클라이언트를 구현한다고 가정 해 봅시다. 둘 다 이미 서로 연결되어 있으며 번호를 입력하기를 기다리고 있습니다. 나는 내가 옳을 것이라고 생각하는 것을 내려 놓았지만, 그것이 완전하지 않다는 것을 알고 있습니다 (대의원을 서버와 클라이언트 모두에 연결하는 한). 내가 어디에 두어야할지 모르는 한 가지는 프로토콜 선언이므로 누군가 가이 간단한 문제를 수행 할 수 있다면 대의원이 수업에 어떻게 구현되는지 배우는 한 많은 도움이 될 것입니다.
그건 그렇고, 나는 누군가가 나에게 무엇을 연결하는지 보여주고 싶다면 iPhone SDK 3.0의 새로운 GameKit에서 Peer Picker와 함께 일하고 있습니다. 예를 들어, 나는 있습니다 피어 피커에 대한 Apple Guide의 3 단계. 이제 5 단계가 내 프로젝트에서 어디로 가는지 모르겠습니다. 이 대의원 구현을 이해하는 데 도움을 줄 수있는 모든 분들께 감사드립니다 ... 당신은 지금까지 훌륭했습니다!
exampppdelegate.h
#import <UIKit/UIKit.h>
@class ExampleAppViewController;
@interface ExampleAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
ExampleAppViewController *viewController;
int sum;
}
@property (nonatomic, retain) sum;
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet ExampleAppViewController *viewController;
-(void) addNum:(int)num;
@end
exampppdelegate.m
#import "ExampleAppDelegate.h"
#import "ExampleAppViewController.h"
@implementation ExampleAppDelegate
@synthesize window;
@synthesize viewController;
- (void)applicationDidFinishLaunching:(UIApplication *)application {
application.idleTimerDisabled = YES;
// Override point for customization after app launch
[window addSubview:viewController.view];
[window makeKeyAndVisible];
}
- (void)dealloc {
[viewController release];
[window release];
[super dealloc];
}
-(void)addNum:(int)num {
sum += num;
}
@end
exampleAppviewController.h
#import <UIKit/UIKit.h>
#import <GameKit/GameKit.h>
@interface ExampleAppViewcontroller : NSObject {
IBOutlet UILabel *sumField; // will display the total sum, one number entered //by the server and one entered by the client, on both iPhones after calculation
int sum; // the total sum after addition;
ServerClass *server; // some server
ClientClass *client; // some client
int num; // the number to add to sum
}
@property(nonatomic, assign) sum;
@property(nonatomic, retain) num;
-(void) displaySum;
@end
exampleAppViewController.m
#import "ExampleAppViewcontroller.h"
@implementation ExampleAppViewController
@synthesize sum;
@synthesize num;
-(void) displaySum {
[sumfield setText: @"%i", sum];
}
@end
해결책
게시 한 코드에 대한 자세한 분석을 진행하지 않을 것입니다. 가장 유용한 응답은 특정 코드 샘플을 초월하는 일반적인 원칙에 따라 어떤 방향입니다. 일반적인 원칙은 다음과 같습니다.
- 대의원은 객체가 특정 이벤트 또는 행동을 처리하거나 응답하기 위해 (일반적으로) 호출되는 객체입니다.
- 대의원이되기를 원하는 대의원을 받아들이는 물건을 "말해야합니다. 이것은 전화로 이루어집니다
[object setDelegate:self];
또는 설정object.delegate = self;
코드에서. - 대의원 역할을하는 개체는 지정된 것을 구현해야합니다. 대표 방법. 객체는 종종 프로토콜 또는 카테고리를 통해 NSObject에서 메소드를 기본/빈 메소드 또는 둘 다로 정의합니다. (공식적인 프로토콜 접근법은 아마도 더 깨끗할 것입니다. 특히 Objective-C 2.0은 선택적 프로토콜 방법을 지원합니다.)
- 관련 이벤트가 발생하면 호출 객체는 대의원이 일치하는 메소드를 구현하는지 확인합니다 (사용
-respondsToSelector:
) 그리고 그 방법이 그 방법을 호출합니다. 그런 다음 대의원은 발신자에게 통제를 반환하기 전에 응답해야 할 일을 수행 할 수있는 통제력이 있습니다.
당신이 겪고있는 특정 예에서 gkpeerpickercontroller 이름이 지정된 속성이 있습니다 delegate
유형의 객체를 수락합니다 id<GKPeerPickerControllerDelegate>
. 이것은 의미합니다 id
(nsobject의 모든 서브 클래스)에서 방법을 구현하는 GKPeerPickerControllerDelegate
규약. gkpeerpickercontrollerdelegate 차례로 다수의 대표 방법을 정의하고 언제 호출 될시기를 설명합니다. 해당 메소드 중 하나 이상을 구현하고 (문서에 모두 선택 사항이지만 두 개는 예상된다고 말하고) 대의원으로 등록하면 해당 방법이 호출됩니다. (.h 파일에서 메소드 프로토 타입을 선언 할 필요가 없으며 프로토콜 헤더를 가져오고 .m 파일에서 메소드를 구현하기 만하면됩니다.
다른 팁
나는 OBJC와 iPhone 개발을 배우고 있습니다. 나는 대의원과 그들의 사용을 완벽하게 이해한다고 말하기까지 멀리 도달하지 않을 것입니다. 첫 번째 iPhone 응용 프로그램, Apple 사이트의 개발자 포털에서 발견 된 것은 텍스트 필드에서 편집 할 때 키보드가 사라지는 메소드를 무시하기 위해 Textfield 대표를 사용하는 매우 간단한 예를 자세히 살펴 봅니다. 예를 들어, 관련 스 니펫을 거기에서 붙여 넣을 수있는 경우 :
// MyViewController.h
#import <UIKit/UIKit.h>
@interface MyViewController : UIViewController <UITextFieldDelegate> {
UITextField *textField;
UILabel *label;
NSString *string;
}
@property (nonatomic, retain) IBOutlet UITextField *textField;
@property (nonatomic, retain) IBOutlet UILabel *label;
@property (nonatomic, copy) IBOutlet NSString *string;
- (IBAction)changeGreeting:(id)sender;
@end
// MyViewController.m
#import "MyViewController.h"
@implementation MyViewController
@synthesize textField;
@synthesize label;
@synthesize string;
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
if (theTextField == textField) {
[textField resignFirstResponder];
}
return YES;
}
@end
여기, textFieldShouldReturn
의 일부인 방법입니다 UITextFieldDelegate
규약. 내가 이해 한만큼 중요한 것은 어느 수업이 당신이 대의원 방법을 구현하든 해당 수업입니다. ~ 해야 하다 해당 대의원의 프로토콜을 따르십시오 (상속 된 클래스 이름 바로 옆에있는 각도 브래킷으로 프로토콜 이름을 둘러싸게함으로써).