2009-10-23 147 views
1

我想知道是否有人以編程方式而不是通過界面構建​​器知道任何良好的在線資源/教程來創建視圖和控制器。我看過的所有東西都使用界面構建器和創建的筆尖,而IB是可以的,我希望可以選擇手動開發這些東西(兩者都是出於實際的原因,並且很好地理解了它們如何融合在一起而不是表面化的你從拖放東西中獲得的東西)。iPhone手工製作視圖/控制器

我的背景是在Java中,我使用界面生成器發展的意見的方式我會發現它緩慢,令人沮喪,有時做他們在Java中,即或者

  • 編程從域生成源模型,然後調整的結果,如果requried
  • 使用一些元數據和/或反射和動態添加控制到視圖

另外,一旦我已經創建了一個視圖是有反正我可以將其添加到接口生成器到ma可以將它用作另一個視圖的子視圖嗎?

感謝,維克

回答

1

當您從NIB初始化對象時,Interface Builder方法會創建在運行時重新創建的「凍幹」對象。它仍然使用相同的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]; 
} 
+0

謝謝你,這是非常有幫助的。 – vickirk 2009-10-23 14:13:02

0

我幾個月前有同樣的問題,當我想要做的Emacs中所有的iPhone開發。長話短說:我不再爲iPhone開發了:)

我仍然建議你檢查我的問題和一些有用的答案here

+0

他不是問一個開發環境,而它的方式來建立自己的觀點(編程或圖形)。與文本編輯器無關。 – jbrennan 2009-10-23 00:23:25

0

我通常不會爲iPhone開發太多地使用接口構建器。通常我會在這樣的代碼中創建一個視圖控制器

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

或者沿着這些線。通常我會創建一個UIViewController的子類,這是我佈置我的視圖等的地方。這些視圖是UIView的子類(Apple提供的東西就像UIButton等等,或者我自己創建的東西)。如果你對UIViewControllerUIView都有所瞭解,你應該清楚它的工作原理。