سؤال

حسنًا ، أنا أقوم برمجة في Objective-C واستخدام Xcode. لقد قرأت من خلال الوثائق على موقع الويب الخاص بـ Apple وفهم ماهية المندوب ، لكن عندما أتوصل إلى الجزء الذي تتحدث فيه عن كيفية تنفيذ أساليب المندوب فعليًا ، أصبحت مرتبكًا ، خاصةً عندما يقولون شيئًا مثل "تنفيذ الآن المندوب طريقة." ربما يكون الأمر أنا فقط ، لكنني لا أعرف بالضبط مكان تنفيذ الطريقة (هل سيكون ملف AppDelegate.h/.M هو الموقع الصحيح في موقف بسيط حيث لا أملك سوى فئة ViewController و AppDelegate؟). أعتقد حقًا أن أفضل طريقة بالنسبة لي لأتعلم هي رؤية مثال بسيط للغاية.

لقد حصلت على بعض التعليمات البرمجية أدناه وكنت أتساءل عما إذا كان بإمكان شخص ما أن يمر ويريني كيفية توصيل المندوب بـ ViewController بحيث يظهر المبلغ؟ آسف إذا كان الرمز طويلًا ، ولكن هذا هو أبسط مثال تفويض يمكن أن أفكر فيه. من أجل الوسيطة ووجود رمز أقل للنظر (مما يجعل من الأسهل بالنسبة لي رؤية ما يحدث) ، يتيح أن نقول خادم Serverclass *ينفذ خادم وعميل عميل *يقوم عميل. كلاهما متصل بالفعل ببعضهما البعض وينتظران إدخال رقمهما. لقد وضعت ما أعتقد أنه سيكون صحيحًا ولكني أعلم أنه غير مكتمل (بقدر توصيل المندوب بكل من الخادم والعميل). شيء واحد لا أعرف مكان وضعه هو إعلانات البروتوكول ، لذلك إذا كان بإمكان شخص ما القيام بهذه المشكلة البسيطة ، فسيساعدني ذلك كثيرًا فيما يتعلق بكيفية تنفيذ المندوب في الفصل.

بالمناسبة ، أنا أعمل مع Peer Picker في لعبة GameKit الجديدة من iPhone SDK 3.0 إذا كان شخص ما يرغب أيضًا في إظهار ما يتصل بما يتصل بما يتصل بما يتصل به. على سبيل المثال ، أنا في الخطوة 3 من دليل Apple لمنتقي النظراء. الآن ، لا أعرف إلى أين تذهب الخطوة 5 في مشروعي. شكرًا لجميع الذين يمكنهم مساعدتي في فهم هذا المندوب ... لقد كنت جميعًا رائعًا حتى الآن!

exampleplegate.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

exampleplegate.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 عبر فئة كطرق افتراضية/فارغة ، أو كليهما. (من المحتمل أن يكون نهج البروتوكول الرسمي أكثر نظافة ، خاصة الآن أن الهدف-C 2.0 يدعم طرق البروتوكول الاختياري.)
  • عند حدوث حدث ذي صلة ، يتحقق كائن الاتصال لمعرفة ما إذا كان المندوب ينفذ طريقة المطابقة (باستخدام -respondsToSelector:) وتدعو هذه الطريقة إذا كان كذلك. ثم يكون للمندوب سيطرة على فعل كل ما يجب أن يستجيب قبل إعادة التحكم إلى المتصل.

في المثال المحدد الذي تعمل فيه ، لاحظ ذلك GkpeerpickerController يحتوي على عقار اسمه delegate الذي يقبل كائن من النوع id<GKPeerPickerControllerDelegate>. هذا يعني id (أي فئة فرعية من NSObject) التي تنفذ الأساليب في GKPeerPickerControllerDelegate بروتوكول. gkpeerpickerControllerDelegate يحدد بدوره عددًا من أساليب المندوب ويصف متى سيتم استدعاؤها. إذا قمت بتطبيق واحدة أو أكثر من هذه الطرق (تقول الوثائق أن جميعها اختيارية ، ولكن من المتوقع أن يكون هناك اثنان) والتسجيل كمندوب ، فسيتم استدعاء هذه الطرق. (لاحظ أنك لست بحاجة إلى إعلان نموذج أولي في ملف .h ، ما عليك سوى استيراد رأس البروتوكول وتنفيذ الطريقة في ملف .m الخاص بك.

نصائح أخرى

أنا أتعلم تطوير OBJC و iPhone. لن أصل إلى أبعد من ذلك بقول أنني أفهم المندوبين واستخدامهم بشكل مثالي. تطبيق iPhone الأول الخاص بك, ، الموجود في بوابة المطورين على موقع Apple ، يسير بالتفصيل مثالًا بسيطًا للغاية يستخدم مندوبًا من Textfield لتجاوز طريقة لجعل لوحة المفاتيح تختفي عند التحرير على ملعب 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