标签: initwithframe

Objective C - 自定义视图和实现init方法?

我有,我希望能够来初始化一个自定义视图in-codenib.

写两种方法initWithFrameinitWithCoder方法的正确方法是什么?它们共享一块用于初始化的代码块.

objective-c initwithframe initwithcoder

26
推荐指数
2
解决办法
3万
查看次数

[UIView initWithFrame:]的文档冲突:是否可为空?

使用CLANG_ANALYZER_NONNULL(ie -Xclang nullability),我得到“ 从预期返回非空值的函数返回Null ”:

在此处输入图片说明

使用Xcode 7.3和iOS 9.3文档,我检查了一下initWithFrame:,它可以返回nil

描述

但是UIView.h用封装了所有内容NS_ASSUME_NONNULL_BEGIN,因此我们可以解释以下内容:

接口

如:

- (nonnull instancetype)initWithFrame:(CGRect)frame NS_DESIGNATED_INITIALIZER;
Run Code Online (Sandbox Code Playgroud)

因此文档说明了nullable,而标头文件说明了nonnull。信任哪一个?

我应该写:

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (!self) {
        // workaround for clang analyzer
        return (void * _Nonnull)nil;
    }
    // Initialization code
    return self;
}
Run Code Online (Sandbox Code Playgroud)

要么:

- (nonnull instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    // Initialization code
    return self;
}
Run Code Online (Sandbox Code Playgroud)

更新

Xcode文档已更新,现在为: initWithFrame:文档

因此,不再有冲突。

objective-c uiview ios initwithframe objective-c-nullability

6
推荐指数
1
解决办法
347
查看次数

Cocoa:未调用来自自定义视图代理的 initWithFrame

根据苹果的文档创建自定义视图,如果您在界面生成器中使用自定义视图代理,则应调用此方法。

如果您尚未为自定义视图创建 Interface Builder 调色板,则可以使用两种技术在 Interface Builder 中创建子类的实例。第一个是使用 Interface Builder 容器面板中的自定义视图代理项。此视图是自定义视图的替代品,允许您相对于其他视图定位和调整视图大小。然后使用检查器指定视图表示的 NSView 的子类。当应用程序加载 nib 文件时,自定义视图代理会创建指定视图子类的新实例,并使用 initWithFrame: 方法对其进行初始化,并根据需要传递任何自动调整大小标志。然后视图实例接收一个awakeFromNib 消息。

不幸的是,在我的情况下它没有被调用。有没有人处理过这个问题?

macos cocoa initwithframe

2
推荐指数
1
解决办法
364
查看次数

loadNibNamed与initWithFrame设置框架高度和宽度的困境

我创建了一个与.xib文件关联的UIView子类.这个UIView子类将在UIViewController中使用.在控制器中,我认为我们实例化UIView子类有两种选择:

MyUIView *myView=[[MyUIView alloc] initWithFrame:aRect];
Run Code Online (Sandbox Code Playgroud)

MyUIView *myView = [[[NSBundle mainBundle] loadNibNamed:@"MyUIView" 
                                                  owner:self 
                                                options:nil] lastObject]; 
Run Code Online (Sandbox Code Playgroud)

我更喜欢允许我执行自定义初始化的第一种方法或其变体.唯一的问题是我必须指定一个框架的rect,它已经在中指定了.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; …
Run Code Online (Sandbox Code Playgroud)

uiview designated-initializer ios initwithframe loadnibnamed

1
推荐指数
1
解决办法
5879
查看次数