문제

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 규약. 내가 이해 한만큼 중요한 것은 어느 수업이 당신이 대의원 방법을 구현하든 해당 수업입니다. ~ 해야 하다 해당 대의원의 프로토콜을 따르십시오 (상속 된 클래스 이름 바로 옆에있는 각도 브래킷으로 프로토콜 이름을 둘러싸게함으로써).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top