2013-07-23 86 views
1

我是一位.net程序員,上週我開始閱讀有關objective-c的內容。與類相關的東西有點清楚,今天我瞭解了協議和代表,我不能說它是100%清楚,但我明白了,它看起來與來自C#的代表和事件很多。這是連接屏幕的正確方法嗎?

這是我在教程後創建的一個簡單示例。它大約有2個屏幕,第一個(一個標籤和一個按鈕)啓動第二個屏幕(一個文本框和一個按鈕),它發回一個字符串。無論編程語言如何,我都認爲它是使用事件的典型例子。

#import <UIKit/UIKit.h> 
#import "ValueViewController.h" 

@interface ViewController : UIViewController<ValueViewControllerDelegate> 

- (IBAction)btnGetValue:(id)sender; 

@property (weak, nonatomic) IBOutlet UILabel *lblCurrentValue; 

@end 

#import "ViewController.h" 
#import "ValueViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (IBAction)btnGetValue:(id)sender { 
    ValueViewController *valueVC = [self.storyboard instantiateViewControllerWithIdentifier:@"ValueViewController"]; 
    valueVC.delegate=self; 
    [self presentViewController:valueVC animated:FALSE completion:nil]; 
} 

-(void) sendValue:(ValueViewController *)controller didFihishWithValue:(NSString *)value 
{ 
    self.lblCurrentValue.text=value; 
} 

@end 


#import <UIKit/UIKit.h> 

@class ValueViewController; 

@protocol ValueViewControllerDelegate<NSObject> 

-(void) sendValue:(ValueViewController*) controller didFihishWithValue:(NSString*) value; 

@end 

@interface ValueViewController : UIViewController<UITextFieldDelegate> 

@property (weak, nonatomic) IBOutlet UITextField *txtValue; 

- (IBAction)btnSetValue:(id)sender; 

@property (weak, nonatomic) id<ValueViewControllerDelegate> delegate; 

@end 

#import "ValueViewController.h" 

@interface ValueViewController() 


@end 

@implementation ValueViewController 

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

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.txtValue.delegate=self; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

-(BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
    return [textField resignFirstResponder]; 
} 

- (IBAction)btnSetValue:(id)sender 
{ 
    [self.delegate sendValue:self didFihishWithValue:self.txtValue.text]; 

    [self dismissViewControllerAnimated:FALSE completion:nil]; 
} 
@end 

我的問題是:考慮,比方說,30個屏的應用程序,它允許發送和接收消息,添加好友等 這是一個好的方法來組合這些4-5消息視圖控制器進入一個故事板,那些朋友將視圖控制器關聯到另一個故事板,然後像編程那樣在這個簡單的例子中建立連接?我看到連接可以在設計器中完成,無需編寫代碼,但有時我認爲您必須編寫代碼來發送一些參數,這意味着將兩者混合(以圖形和編程方式)。 我只是覺得更舒服,以編程方式進行,也許是因爲這是我如何在C#中做到這一點。

我期待着您關於在屏幕之間進行組織和連接的提示。 PS:對不起,在這裏寫這麼長的故事(板),我保證把它縮短在我以下的帖子。

謝謝。

回答

0

製作兩個互相溝通的故事板會違背預期的流程,因爲故事板並不是用來分組應用程序的部分。雖然應用程序可能肯定有多個故事板,但允許多個故事板背後的意圖是讓您支持不同的屏幕範例(即iPhone和iPad)或不同的本地化,而不是將相關屏幕分組在一起。

但請注意,故事板是相對較新的。您可以在NIB文件中定義您的視圖,然後使用它們。這種選擇的一個不幸的後果是,你需要以編程方式建立你所有的連接,但另一方面,你可以使用文件組或文件夾在你的Xcode項目中對你的視圖進行分組。

+0

從我所瞭解的NIB文件已經過時,故事板是要走的路。 – user2611691

+1

@ user2611691不,NIB不會過時。他們甚至沒有棄用,我不明白他們如何或爲什麼會被拒絕([link](http://stackoverflow.com/a/8495940/335858))。 – dasblinkenlight

+0

這清楚地表明,豆粒不會被棄用,對於那些30-40屏幕,都可以在一個單一的故事板,是不是太多了? – user2611691

相關問題