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:很抱歉在这里写了这么长的故事(板),我保证在我的后续帖子中将其缩短。

谢谢。

4

1 回答 1

0

制作两个相互通信的情节提要将违背预期的流程,因为情节提要并非用于对应用程序的各个部分进行分组。尽管一个应用程序可能肯定有多个故事板,但允许多个故事板背后的意图是让您支持不同的屏幕范例(即 iPhone 与 iPad)或不同的本地化,而不是将相关屏幕组合在一起。

但是请注意,情节提要相对较新。您可以在 NIB 文件中定义您的视图,并改为使用它们。这种选择的一个不幸结果是您需要以编程方式进行所有连接,但另一方面,您可以使用文件组或文件夹在 Xcode 项目中对视图进行分组。

于 2013-07-23T18:34:59.137 回答