تعطل التطبيق بعد محاولة ضبط Typedef enum
-
27-09-2019 - |
سؤال
لقد طرحت سؤالًا مشابهًا لهذا من قبل ، لكن لدي مشكلة جديدة في ذلك ، لذا قمت بإعادة نشر جزء من السؤال.
لدي هذا قبل إعلان الواجهة في بلدي 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 الفرعي ، حتى تتمكن من الوصول إليها في أي وقت.
- يعلن
MainView *drawBox;
في .h - في ViewDidload ، init كما
drawBox = [[MainView alloc] initWithFrame:(CGRectMake(60, 80, 200, 200))];
- ببساطة اتصل
[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:] مباشرة.