【问题标题】:Custom UIView with custom XIB: IBOutlets not working带有自定义 XIB 的自定义 UIView:IBOutlets 不起作用
【发布时间】:2012-02-28 04:48:30
【问题描述】:

我正在使用最新的 SDK 和 XCode 4.2 开发一个 iOS 应用。

我想在自定义 UIView 中使用自定义 XIB。

我的自定义 UIView:

@interface CoordinateView : UIView {
    /**
     */
    ARGeoCoordinate *geoCoordinate;
    /**
     */
    IBOutlet UILabel* title;
    /**
     */
    IBOutlet UILabel* subTitle;
    /**
     */
    IBOutlet UIImageView* image;
}

实施:

@implementation CoordinateView

@synthesize geoCoordinate;

- (id)initWithFrame:(CGRect)frame 
{
    self = [super initWithFrame:frame];
    if (self) 
    {
        // Initialization code.
        //
        NSArray* topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CoordinateView" owner:nil options:nil];
        for(id currentObject in topLevelObjects)
        {
            if ([currentObject isKindOfClass:[CoordinateView class]])
            {
                [self addSubview:currentObject];
                break;
            }
        }
    }
    return self;
}

- (id)initForCoordinate:(ARGeoCoordinate *)coordinate
{
    self.geoCoordinate = coordinate;
    CGRect theFrame = CGRectMake(0, 0, BOX_WIDTH, BOX_HEIGHT);

    self = [self initWithFrame:theFrame];
    if (self)
    {
        title.text = geoCoordinate.title;
        image.image = [UIImage imageNamed:[NSString stringWithFormat:@"03%d.jpg", geoCoordinate.id]];
    }
    return self;
}

初始化CoordinateView我使用initWithCoordinate方法。

调试我发现titleinitWithCoordinate 里面是零:

title.text = geoCoordinate.title;

我已经使用 Interface Builder 来“链接”IBOutlets。

我做错了什么?

【问题讨论】:

    标签: ios cocoa-touch uiview xib


    【解决方案1】:

    不久前我遇到了同样的问题。这是我为修复它所做的:

    1. 在 xib 中,打开文档大纲(显示视图列表及其子视图等的左侧窗格)。
    2. 左键单击代表您的类的视图(在您的情况下为 CoordinateView)并将蓝线向下拖动到子视图(在您的情况下 UILabel 称为标题)
    3. XCode 应该会弹出一个带有“标题”选项的小对话框(因为您的标签称为标题。)
    4. 点击标题和wallaa。
    5. 返回调试并检查您的 outlet 是否仍然为零。

    只是个人喜好(不一定与讨论的主题相关):我会将您的 UILabel 称为“titleLabel”而不是“title”,因为 [objectInstance title] 看起来会向不知道的人返回 NSString 'title' 是一个 UILabel。个人喜好,仅此而已。

    干杯

    【讨论】:

    • XCode 9 和 iOS 11 仍然存在问题,但步骤 3 中的对话框没有。你能更新你的答案吗?
    【解决方案2】:

    在您的initWithFrame: 方法中,您应该将self 分配给currentObject,而不是将其添加为子视图。

    此外,由于您的视图布局由您的 xib 文件确定,因此无需覆盖 initWithFrame: 并调用 super 方法。

    【讨论】:

    • 在我的项目中,我已经按照您的建议进行了操作,并且一切正常,直到有一天我不得不添加一个 NSMutableArray 作为我的 UIView 子类的属性(我们称之为 MyCustomView)。我在 MyCustomView 初始化方法中分配并初始化了数组。但不知何故,当应用程序运行时,数组会神秘地变成 nil。我尝试将其添加为 iVar,但同样的问题仍然存在。然后我用谷歌搜索并找到了将加载了 loadNibNamed 的视图添加到 self 的方法(self 是 MyCustomView 的一个实例)。这不知何故奏效了。关于我做错了什么有什么想法吗?
    【解决方案3】:

    当视图完全加载时,viewDidLoad 方法被调用。所以,你应该在那里初始化视图中的元素:

    - (void)viewDidLoad {
        title.text = self.geoCoordinate.title;
    }
    

    更多信息请关注docs

    【讨论】:

    • viewDidLoad 是 UIViewController 方法,我没有使用 UIViewControllers。
    • 你是如何在没有 UIViewController 的情况下加载你的 xib 文件的?
    猜你喜欢
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多