0

我尝试将 myClass 对象分配给UIView类对象并使用 myClass 变量。

所以,

我创建了包含单位段控制的 myClass

@interface myClass : UIView
@property (nonatomic,readonly) UISegmentedControl *units;

在我的UIViewController我尝试做这样的事情

myClass *newObject = [[myClass alloc]init];

UIView *newView;

newView = newObject;

[[newView units] addTarget:self action:@selector(changeUnit) 
                      forControlEvents: UIControlEventValueChanged];

我收到“声明‘单位’不可见@interfaceUIViewselector

可以不使用myClass *newView = [[myClass alloc]init];对象吗?

4

2 回答 2

2

好吧,多亏了 Objective-C 的灵活性,尽管这是一个奇怪的要求,但可以按照您的要求进行操作。

这行代码:[[newView units] addTarget:...]不应生成任何编译器错误(除非您已将“将警告视为错误”标志设置为 YES),但它会生成警告。只要newView变量实际上是一个实例,myClass一切都会按预期工作。

您还可以采取一些预防措施,例如使用respondsToSelector:isKindOfClass:方法。这是一种使代码更健壮的方法:

myClass *newObject = [[myClass alloc] init];

UIView *newView = nil; // always initialize method variables to nil

newView = newObject;

// make sure 'newView' can respond to the 'units' selector
if ( [newView respondsToSelector:@selector(units)] )
{
    // if it does, use 'performSelector' instead of calling the method
    // directly to avoid a compiler warning
    id unitsObject = [newView performSelector:@selector(units)];

    // make sure the object returned by 'performSelector' is actually
    // a UISegmentedControl
    if ( [unitsObject isKindOfClass:[UISegmentedControl class]] )
    {
        // if it is, cast it...
        UISegmentedControl *units = (UISegmentedControl*)unitsObject;

        // ... and add the Target-Action to it
        [units addTarget:self action:@selector(changeUnit) 
                  forControlEvents: UIControlEventValueChanged];
    }
}

只记得

  • 正确初始化 'myClass' 中的 'units' 属性或在使用它之前正确分配它
  • 当您实例化“newObject”变量时,您调用的是“init”而不是默认的初始化程序“initWithRect:”。确保这是预期的行为。

希望这可以帮助!

于 2013-10-15T20:57:48.513 回答
1

这是面向对象编程的基础知识。你newView的是一个UIView,没有units

你的子类myClassunits.

只需使用[[newObject units] addTarget...(etc)].

于 2013-10-15T20:00:41.280 回答