【问题标题】:Initialization of controls in custom uiview自定义uiview中控件的初始化
【发布时间】:2011-01-26 13:57:02
【问题描述】:

我在 IB 中创建了一个自定义 uiview 并为其设置了类。

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>

@interface myView : UIControl {
    IBOutlet UITextView *textView;
}
@end

#import "myView.h"

@implementation myView

- (void)commonInit
{
    [textView setText:@"lajsdfklasdfjl"];
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super initWithCoder:aDecoder])
    {
        [self commonInit];
    }
    return self;
}

-(id)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame])
    {
        [self commonInit];
    }
    return self;
}

@end

我在 IB 中的这个视图上放了一个带有文本的 textview,并将它链接到 IBOutlet IUTextView *textView。 当我将这个自定义视图拖到我的 UIViewController 上时(来自 IB 库中的类选项卡),视图是空的。 - (id)initWithCoder:(NSCoder *)aDecoder 正在调用,但 textView 为空。 怎么了?谢谢

【问题讨论】:

    标签: iphone objective-c interface-builder


    【解决方案1】:

    据我记得,层次结构在 init 中没有正确设置,因为属性只能在 init 完成后设置。

    你想用

    -(void)awakeFromNib
    {
        [super awakeFromNib];
        [self commonInit];
    }
    

    而是完全删除 initWithCoder: 的东西。

    作为旁注,你应该让你的类名以大写字母开头。

    【讨论】:

      【解决方案2】:

      应该没有什么可以阻止您使用自定义 UIViewController,它具有用于初始化或解除分配它所包含的 UIView 的内置方法。我发现这是一个更简单的解决方案。例如,您可以使用带有 UIView 的 nib 设置自定义 UIViewController,然后确保将 File's Owner 设置为自定义类。

      然后您可以删除以下 3 个实例方法

      - (void)commonInit
      - (id)initWithCoder:(NSCoder *)aDecoder
      - (id)initWithFrame:(CGRect)frame
      

      并在您的自定义 UIViewController 类中使用 initWithNibName 如下

      - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
      {
          self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
          if (self) {
              // Custom initialization
              self.view.frame = CGRectMake(0, 44, self.view.frame.size.width, self.view.frame.size.height);
          }
          return self;
      }
      

      当您像这样分配自定义 UIViewController 类时,将自动调用此 initWithNibName 实例方法

      CustomUIViewController *vc = [[CustomUIViewController alloc] init];
      

      在 initWithNibName 中放置一个断点,你会看到它被调用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-26
        • 2010-09-12
        • 2017-04-26
        相关资源
        最近更新 更多