【问题标题】:Creating a view controller without a nib创建一个没有 nib 的视图控制器
【发布时间】:2012-06-05 02:48:18
【问题描述】:

在 AppDelegate 中,我想创建一个 UIViewController 子类并添加它的视图。 viw 本身将在代码中指定 - 没有 nib。

根据苹果文档,我应该使用

initWithNibName:nil bundle:nil];

然后在控制器的 loadView 中,添加我的子视图等。

但是,下面的测试代码对我不起作用。我在 Apple 的 PageControl demo 上对 AppDelegate 代码进行了建模,仅仅是因为我的应用程序将实现类似的结构(特别是用于管理分页滚动视图的基本控制器,以及用于构建页面的其他控制器数组)。

但我怀疑我的 AppDelegate 代码是问题所在,因为日志记录证明 initWithNibName:: 和 loadView 都会触发。下面的应用程序运行,但屏幕是空白的。我期待一个带有标签的绿色视图。

AppDelegate

        - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        ScrollerController *controller = [[ScrollerController alloc] initWithNibName:nil bundle:nil];
        [self.window addSubview:controller.view];
        [self.window makeKeyAndVisible];
        return YES;
    }

ScrollerController(UIViewController 子类)

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)loadView{
    CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame];
    UIView *contentView = [[UIView alloc] initWithFrame:applicationFrame];
    contentView.backgroundColor = [UIColor greenColor];
    self.view = contentView;

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(40, 40, 100, 40)];
    [label setText:@"Label created in ScrollerController.loadView"];
    [self.view addSubview:label];
}

【问题讨论】:

  • 我在演示项目中注意到有一个以 AppDelegate 作为 fole 所有者的 xib - 大概这是向应用程序提供我缺少的部分?
  • 在 viewDidLoad 之后检查视图包含的内容
  • 一切似乎都在那里 - self.view: > Subviews: 1 Subview 0: >

标签: ios model-view-controller ios5 uiview uiviewcontroller


【解决方案1】:

代替 initWithNibNamed:,只需使用 alloc 和 init 或任何其他指定的视图控制器初始化器。这是来自project的示例

hoverViewController=[[BDHoverViewController alloc] initWithHoverStatusStyle:BDHoverViewStatusActivityProgressStyle];
self.window.rootViewController=hoverViewController;
[self.window makeKeyAndVisible];

另外,将根视图控制器添加到应用程序委托中的窗口的正确形式(无论如何现在)是这样的:

self.window.rootViewcontroller=controller;
[self.window makeKeyAndVisible];

您不需要将视图添加到窗口中。上面的代码会自动完成。

祝你好运,

T

【讨论】:

  • 这后半部分看起来不错,但是你有前半部分的来源吗?我只是问,因为我已经阅读(我认为在苹果文档中)初始化没有 nib 的控制器的正确方法是使用 nil。我看看能不能找到我读到的地方。
  • 我是在 SO 上阅读的,因此不一定具有权威性:2a。以编程方式加载视图 如果您选择覆盖 -loadView,您可以以任何您喜欢的方式创建视图、子视图、其他视图控制器以及这些对象之间的任何连接。当然,这意味着您还负责与您创建的对象相关的内存管理。如果您的子类覆盖 -loadView,则应使用 nil 对 nibName 和 bundle 进行初始化。消息来源:stackoverflow.com/questions/5107604/…
  • 是的,你是对的,我快速浏览了文档,这是正确的。为了安全起见,我仅在使用方法时才尝试使用 initWithNibNamed: 方法。我已经更新了我的答案。
【解决方案2】:

尝试使用: self.window.rootViewController = controller; 代替 [self.window addSubview:controller.view];

请注意,您还应该@synthesize window; 并创建它 self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

【讨论】:

  • 我正在合成窗口,但为什么我需要自己创建呢? - 我只是问,因为苹果的演示项目没有这样做。
  • 这取决于,您是以编程方式创建所有内容,还是使用笔尖中的窗口。如果您不使用笔尖中的窗口,则需要按照 Sulthan 的建议以编程方式创建窗口。
猜你喜欢
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多