我设法用笔尖设置了一个自定义UIView类。

我的.h看起来像

@interface MyView : UIView <UITextFieldDelegate>

@property (nonatomic, weak) IBOutlet UITextField *textField;
@property (nonatomic, strong) MyView *topView;

和.m
 @implementation MyView

NSString *_detail;

    -(id)initWithCoder:(NSCoder *)aDecoder{
            if ((self = [super initWithCoder:aDecoder])&&self.subviews.count==0){

                MyView *v = [[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil] objectAtIndex:0];
                self.textField = v.textField;
                if (self.topView == nil)self.topView = self;
                v.topView = self.topView;
                [self addSubview:v];
            }
            return self;
        }


    -(NSString *)topDetail{
        return _detail;
    }
    -(NSString *)detail{
        return [self.topView topDetail];
    }
    -(void)setTopDetail:(NSString *)detail{
        _detail = detail;
    }
    -(void)setDetail:(NSString *)detail{
        [self.topView setTopDetail:detail];
    }
    - (BOOL)textFieldShouldReturn{
        //here I show an UIAlertView using self.detail for the message
    }

注意:我所设置的功能完全符合我的期望。

问题
我想做的是删除手动的detail方法并将NSString *_detail转换为@property (...)NSString *detail
当我尝试使用@property时,如果在我的ViewController中调用myView.detail = someString,myView将引用最顶部的视图。然后,如果textFieldShouldReturn由于用户交互而被调用,则它将调用尚未设置的嵌套MyView_detail

我想要的:
不必编写额外的代码即可访问_detail,无论我从何处访问它。我只想声明该属性,然后继续执行我通常的编码。

最佳答案

您的问题是您要尝试使用对象属性保留类引用topView

换句话说,每个对象的topView都是对象本身,这没有任何意义。

您的定义应为:

@interface MyView : UIView <UITextFieldDelegate>

// Class "properties"
+ (instancetype)topview;
+ (void)setTopView:(UIView *)topView;

// Object properties
@property (nonatomic, weak) IBOutlet UITextField *textField;
@property (nonatomic, strong) NSString *detail;

现在,您可以跟踪topView:
 static MyView * _topView;

 @implementation MyView

+ (instancetype)topView {return _topView}; // You could also create one here lazily
+ (void)setTopView:(UIView *)topView { _topView = topView };

-(id)initWithCoder:(NSCoder *)aDecoder{
            if ((self = [super initWithCoder:aDecoder])&&self.subviews.count==0){

                JUITextFieldHint *v = [[[NSBundle mainBundle] loadNibNamed:@"JUITextFieldHint" owner:self options:nil] objectAtIndex:0];
                self.textField = v.textField;
                if ([MyView topView] == nil)[MyView setTopView:self];
                v.topView = self.topView;
                [self addSubview:v];
            }
            return self;
        }

不再需要手动安装和获取器。现在,您可以将detail属性与anyInstance.detail[MyView topView].detail一起使用,如果您喜欢像我这样的点,甚至可以使用MyView.topView.detail;)

您的init方法仍然看起来很奇怪,但应该可以使用。检查Apples init模板。

最后,只要具有 super 视图,textField就会很弱,否则使其成为strong

关于ios - 自定义UIView变量/属性访问,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22572012/

10-12 00:06