سؤال

لقد طرحت سؤالًا مشابهًا لهذا من قبل ، لكن لدي مشكلة جديدة في ذلك ، لذا قمت بإعادة نشر جزء من السؤال.

لدي هذا قبل إعلان الواجهة في بلدي MainView.h رأس.

typedef enum { UNKNOWN, CLEAR, NIGHT_CLEAR, CLOUDY, NIGHT_CLOUDY } Weather;

ثم أعلنت ذلك (في المقابلة الرئيسية) مثل هذا:

Weather weather;

ثم صنع ملحقًا (وقام بتوليفه):

@property Weather weather;

سؤالي هو ، كيف يمكنني استخدام هذا في MainViewController بدون تحطمها؟ لقد استوردت رأس MainView. حاولت استخدامه مثل هذا:

MainView* myView = (MainView*)self.view;

[myView setWeather: CLEAR];

لا يرميني أي أخطاء في Xcode ، لكنه ينهار عند تشغيل الكود ، قائلاً:

-[UIView setWeather:]: unrecognized selector sent to instance *blah*

أفعل شيئا خطأ هنا؟

في MainViewController الخاص بي:

- (void)viewDidLoad {
    [super viewDidLoad];
    MainView * drawBox = [[MainView alloc] initWithFrame:(CGRectMake(60, 80, 200, 200))];
    drawBox.backgroundColor = [UIColor clearColor];
    [self.view addSubview:drawBox];
}
هل كانت مفيدة؟

المحلول

لقد أضفت MainView باعتبارها نظرة فرعية لـ Self.view. عندما تمر Setweather ، فأنت تسميها فعليًا على Self.view (العرض الرئيسي لوحدة التحكم في العرض الخاصة بك ، وهي Uiview) ، وليس على عرض MainView الخاص بـ Self.view.

احصل على كائن MainView الصحيح من خلال التكرار من خلال self.view.subviews.

تحرير: أو فقط احتفظ بإيفار يشير إلى عرض MainView الفرعي ، حتى تتمكن من الوصول إليها في أي وقت.

  1. يعلن MainView *drawBox; في .h
  2. في ViewDidload ، init كما drawBox = [[MainView alloc] initWithFrame:(CGRectMake(60, 80, 200, 200))];
  3. ببساطة اتصل [drawBox setWeather:CLEAR]; عندما تحتاج إلى

نصائح أخرى

كمتابعة لتعليقي أعلاه:

من المحتمل أن تقول إما [[UIView alloc] initWithFrame:...] في مكان ما أو لديك ملف منشئ واجهة مع كائن عرض. إذا نظرت إلى نافذة المفتش مع تحديد هذا الكائن ، فسيشير إلى "هوية الفصل" كما UIView. تغيير هذا إلى MainView لذلك سيكون للكائن النوع الصحيح في وقت التشغيل.

تحتاج إلى إعلان العقار داخل @interface قسم من MainView, ، وخاصتك Weather weather; يجب أن يكون في قسم متغير مثيل من MainView أيضًا.

استكمال: في ViewDidload ، أنت تضيف MainView الخاص بك كإظهار فرعي إلى VCS الخاص بك view منشأه. ثم عندما تريد استخدامه ، فإنك تحصل على VCS view الممتلكات ، وإلقاءها على MainView. أنت لا تحصل على العرض الذي تريده عندما تفعل ذلك. أنت تحصل على المنظر الذي يحتفظ بمشاهدة MainView الخاصة بك. هذا هو مصدر مشكلتك. self.view أثناء الرجوع إليه ، هو UIVIEW وليس المقابلة الرئيسية. The MainView هي نظرة فرعية لـ Self.view.

في .m هل قمت بتوليف الطقس؟ على سبيل المثال

@synthesize weather; 

بحيث سيتم إنشاء Getter و Setter.

Update] بعد قراءة التحديث الخاص بك في ViewDidload ، من الواضح أنك تصل إلى العرض الخاطئ لأنك ببساطة تستخدم [Self.view AddSubview:] ، وهذا يعني أن Self.view ليس هو المقابلة الرئيسية ، إنها مجرد عرض فرعي. يمكنك فقط إعلان MainView * DrawBox باعتباره Global و Access [DrawBox Setweather:] مباشرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top