【问题标题】:iOS initWithNibName for UIView用于 UIView 的 iOS initWithNibName
【发布时间】:2011-10-15 23:52:16
【问题描述】:

是否可以为扩展 UIView 的自定义类实现 initWithNubName。

例子:

.h

@interface UIPullerView : UIView
{
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;

.m

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    NSBundle *bundle = nibBundleOrNil==nil ? [NSBundle mainBundle] : nibBundleOrNil;
    NSString *nibName = nibNameOrNil==nil ? @"UIPullerView" : nibNameOrNil;
    if (self == [[bundle loadNibNamed:nibName owner:self options:nil] objectAtIndex:0]) 
    {
        NSLog(@"yes, the same class");
    }
    return self;
}

一些控制器类调用这个

UIPullerView *puller = [[UIPullerView alloc] initWithNibName:nil bundle:nil];

这不是一个工作示例,因为我没有将第一个 XIB 对象设置为 self。如果我愿意,我会失去对主要课程的引用,对吗?所以我想添加一个方法来读取XIB文件并将XIB中的对象复制到self中。我不想使用 UIViewController 但 UIView 因此不应将其他视图添加到主视图。

还有我是如何设置 XIB 的:

我愿意

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
...
    self = [[bundle loadNibNamed:nibName owner:self options:nil] objectAtIndex:0]
    return self;
}

但这不是真的吗?

这可能吗?

【问题讨论】:

  • 我不确定我是否理解您想要实现的目标。
  • 我只想将 initWithNibName 方法添加到扩展 UIView(不是 UIViewController)的类中。
  • 我不这么认为。方法“initWithNibName”是在 SDK 的 UIViewController 类中定义的,而不是在 UIView 中,因此您不能在扩展 UIView 的类中覆盖该方法。
  • 这应该类似于 UITableViewCell。

标签: iphone ios xcode ipad uiview


【解决方案1】:

为了解决分配 self 和丢失主类引用的问题,我想知道您是否应该像从 NIB 加载 UITableViewCell 一样这样做:

  [[NSBundle mainBundle] loadNibNamed:@"MyTableCell" owner:self options:nil];
  cell = myTableCell;
  self.myTableCell = nil;

并将执行此操作的类设置为 NIB 的所有者。

当然,如果您在多个不同的地方实例化您的 UIPullerView,那么最后一部分会变得很棘手......

【讨论】:

  • hum... 但是如何将第一个视图(来自 loadNibNamed 数组)设置为所有者?
  • 您将在实例化 UIPullerView 的方法中拥有此代码。所以那个类将是所有者。
  • 嗯是的...我知道,使用 UIViewController 会很容易,但 UIView 与 nib 文件作为同一类很棘手...
【解决方案2】:

创建ExampleView.xib

创建ExampleView.hExampleView.m

 @interface ExampleView : UIView

 @end

ExampleView.xib 的身份检查器中,将自定义类设置为ExampleView

Example.m,添加awakeFromNib

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

每当视图被加载时都会执行,例如:

NSArray *objects = [[NSBundle mainBundle] loadNibNamed:@"ExampleView" owner:self options:nil];
ExampleView *exampleView = [objects firstObject];

【讨论】:

    【解决方案3】:

    试试这个:

    - (instancetype)initWithNib {
        NSString *nibName = [NSString stringWithUTF8String:object_getClassName(self)];
        return [[[NSBundle mainBundle] loadNibNamed:nibName owner:self options:nil] objectAtIndex:0];
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-13
      • 1970-01-01
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多