سؤال

لقد قمت بإنشاء فئة فرعية UIView مرتبطة بملف .xib.سيتم استخدام هذه الفئة الفرعية UIView في UIViewController.في وحدة التحكم، أعتقد أن هناك خيارين لكيفية إنشاء مثيل للفئة الفرعية UIView:

MyUIView *myView=[[MyUIView alloc] initWithFrame:aRect];

و

MyUIView *myView = [[[NSBundle mainBundle] loadNibNamed:@"MyUIView" 
                                                  owner:self 
                                                options:nil] lastObject]; 

أفضّل الطريقة الأولى أو أشكالها المختلفة التي تسمح لي بإجراء التهيئة المخصصة.المشكلة الوحيدة هي أنه لا بد لي من تحديد مستطيل الإطار، والذي تم تحديده بالفعل في .xib (أعني ارتفاع الإطار وعرضه MyUIView).نعم، يمكنني أن أحفظه مرة أخرى aRect, ، لكن الحفاظ على هذا أمر شاق (على سبيل المثال، عندما أقوم بتغيير موضع واجهات المستخدم في .xib، يجب أن أقوم بالتحديث aRect, ، أيضاً).

لذلك يجب أن يتبادر إلى ذهنك النهج الثاني حيث يتم ضبط الإطار بشكل تلقائي.المشكلة المتبقية هي أنني لا أستطيع تخصيص المُهيئ (على سبيل المثال، أريد تمرير معلمات إضافية أثناء التهيئة).

ما هو المفضل لديك؟واحد الذي هو أفضل في رأيك؟

تحرير 1:مستوحاة من إجابة سيرجيو، خرجت بهذا الحل البديل:

// In MyViewController.m
MyUIView *myView=[[MyUIView alloc] initWithFrame:CGRectMake(x, y, 0.0, 0.0)];

// In MyView.m
- (id)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        self = [[[NSBundle mainBundle] loadNibNamed:@"UnmovableTagView" 
                                              owner:self 
                                            options:nil] lastObject]; 
        [self setFrame:CGRectMake(frame.origin.x, 
                                  frame.origin.y, 
                                  [self frame].size.width, 
                                  [self frame].size.height)]; 
        // frame's width and height already determined after 
        // loadNibNamed was called
       ...
    }
    return self;
}
هل كانت مفيدة؟

المحلول

هل حاولت استخدام:

MyUIView *myView=[[MyUIView alloc] initWithFrame:CGRectZero];

لا أعرف ما إذا كان يعمل في حالتك (تحميل العرض من المنقار)، ولكني أستخدمه بنجاح عندما أقوم بإنشاء العرض المخصص الخاص بي برمجيًا.

تستطيع اعطائه محاولة.

يحرر:

يمكنك تحديد بنفسك init طريقة رؤيتك:

-(id)initWithPosition:(CGPoint)pos;

ومن ثم اتصل:

-(id)initWithPosition:(CGPoint)pos {

  if (self = [super initWithFrame:{pos,{0,0}}]) {
    self = [[[NSBundle mainBundle] loadNibNamed:@"UnmovableTagView" 
                                          owner:self 
                                        options:nil] lastObject]; 
    [self setFrame:CGRectMake(frame.origin.x, 
                              frame.origin.y,  
                              [self frame].size.width,    
                              [self frame].size.height)]; 
     // frame's width and height already determined 
     // after loadNibNamed was called

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