【问题标题】:iPhone hand crafted views/controllersiPhone 手工制作的视图/控制器
【发布时间】:2009-10-23 00:04:37
【问题描述】:

我想知道是否有人知道任何好的在线资源/教程,用于以编程方式而不是通过界面构建​​器创建视图和控制器。我所看到的一切都使用界面构建器和创建的 nib,而 IB 还可以一个你通过拖放东西得到的)。

我的背景是 Java,我发现使用界面构建器开发视图的速度很慢而且令人沮丧,就像我有时在 Java 中那样,即

  • 以编程方式从域模型生成源代码,然后根据需要调整结果
  • 使用一些元数据和/或反射并将控件动态添加到视图中

另外,一旦我创建了一个视图,我是否可以将它添加到界面构建器中以使其可用作另一个视图的子视图?

谢谢,维克

【问题讨论】:

    标签: iphone user-interface


    【解决方案1】:

    Interface Builder 方法创建“冻干”对象,当您从 NIB 初始化对象时,这些对象会在运行时重新创建。它仍然使用 allocinit 相同的东西,使用 NSCoder 对象将对象带入内存。

    如果您想拥有一个基于特定 NIB 的视图控制器,您可以覆盖默认的 init 方法并根据该视图控制器的 NIB 对其进行初始化。例如:

    @implementation MyViewController
    -(id) init {
        if (self = [super initWithNibName:@"MyViewController" bundle:nil]) {
            //other setup stuff
        }
        return self;
    }
    

    当你想显示MyViewController时,你可以简单地调用这样的东西:

    - (void) showMyViewController {
        MyViewController *viewController = [[[MyViewController alloc] init] autorelease];
        [self presentModalViewController:viewController animated:YES];
    }
    

    现在,如果您想手动创建视图而不是在 Interface Builder 中创建视图,则根本不必更改 -showMyViewController 方法。摆脱你的 -init 覆盖,而是覆盖你的 MyViewController-loadView 方法以编程方式创建它:

    - (void) loadView {
        UIView *view = [[UIView alloc] initWithFrame:CGRectMake(320,460)];
        self.view = view;
        [view release];
    
        //Create a button
        UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [myButton addTarget:self action:@selector(pressedButton) forControlEvents:UIControlEventTouchUpInside];
        [myButton setTitle:@"Push Me!" forState:UIControlStateNormal];
        myButton.frame = CGRectMake(100,230,80,44);
        [self.view addSubview:myButton];
    }
    

    这个例子展示了如何创建视图并向其添加按钮。如果您想保留对它的引用,请以与使用 NIB(没有 IBOutlet/IBActions)相同的方式声明它,并在分配时使用 self。例如,您的标题可能如下所示:

    @interface MyViewController : UIViewController {
        UIButton *myButton;
    }
    
    - (void) pressedButton;
    
    @property (nonatomic, retain) UIButton *myButton;
    
    @end
    

    还有你的班级:

    @implementation MyViewController
    @synthesize myButton;
    
    - (void) loadView {
        //Create the view as above
    
        self.myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [myButton addTarget:self action:@selector(pressedButton) forControlEvents:UIControlEventTouchUpInside];
        [myButton setTitle:@"Push Me!" forState:UIControlStateNormal];
        myButton.frame = CGRectMake(100,230,80,44);
        [self.view addSubview:myButton];
    }
    
    - (void) pressedButton {
        //Do something interesting here
        [[[[UIAlertView alloc] initWithTitle:@"Button Pressed" message:@"You totally just pressed the button" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK",nil] autorelease] show];
    }
    
    - (void) dealloc {
        [myButton release];
        [super dealloc];
    }
    

    【讨论】:

    • 谢谢你,这很有帮助。
    【解决方案2】:

    几个月前,当我想在 Emacs 中进行所有 iPhone 开发时,我遇到了同样的问题。长话短说:我不再为 iPhone 开发了 :)

    我仍然建议您检查我的问题和一些有用的答案here

    【讨论】:

    • 他不是在问开发环境,而是在问用哪种方式来构建他的视图(以编程方式或图形方式)。与文本编辑器无关。
    【解决方案3】:

    我通常不会过多地使用 Interface builder 进行 iPhone 开发。通常我会用这样的代码创建一个视图控制器

    MyUIViewControllerSubclass *controller = [[MyUIViewControllerSubclass alloc] initWithNibName:nil bundle:nil];
    controller.someProperty = myModel;
    [self presentModalViewController:controller];
    [controller release];
    

    或者类似的东西。通常我会创建一个UIViewController 的子类,这就是我布局视图等的地方。视图是UIView 的子类(Apple 提供的东西,如UIButton 等,或者我自己创建的东西)。如果您阅读了UIViewControllerUIView,您应该对它的工作原理有一个很好的了解。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      相关资源
      最近更新 更多