Objective C - 通过视图控制器传递多个文本字段(或将它们转换为可变数组)以显示为标签

Objective C - Passing multiple text fields (or converting them to a mutable array) through view controllers to display as labels

我是 Objective C 的新手,目前遇到上述问题。我已经学习了教程并尝试在此处找到相关主题,我可以让它为一个变量工作,但是我需要在视图控制器之间传递更多内容。

我试图避免使用全局变量、保存到临时文件和单例(模式)(?)(我听说它会变得混乱)。我还试图避免委派(如果这是正确的术语),因为我觉得它变得过于复杂了。此外,如果以下适用于一个,那么它应该适用于多个。

我在下面的代码中 post 探索了这两种方法。首先尝试分别传递每个文本字段,最初通过一个控制器名称,然后是多个。

其次,通过将所有字符串整理成一个可变数组,并尝试通过控制器传递这个数组,然后将这个数组拆分回 strings/text 用于标签文本。两次尝试都只传递按下“完成”按钮后活动文本字段的信息。

我在弱属性和强属性之间试过,并没有太大的区别。

故事板有 2 个视图控制器(ViewController 和第二个 ViewController),每个视图控制器都有自己的导航控制器,它们之间有一个 show segue。 ViewController 有 2 个文本字段。 secondViewController 有 2 个标签。

代码如下:

ViewController.h(对于字符串和数组方法)

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

@interface ViewController : UIViewController

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

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

@end

ViewController.m(第一种方法): (添加了 prepareforSegue)

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    UINavigationController *navController = (UINavigationController *)segue.destinationViewController;

    //UINavigationController *navController1 = (UINavigationController *)segue.destinationViewController;

    secondViewController *svc = (secondViewController *)navController.topViewController;
    secondViewController *svc1 = (secondViewController *)navController.topViewController;
    //Also tried navController1.topViewController with previous comment

    svc.labelText = _textFieldData.text;
    svc1.labelTwoText = _textFieldDataTwo.text;

}

secondViewController.h(第一种方法)

# import <UIKit/UIKit.h>

@interface secondViewController : UIViewController

@property (weak, nonatomic) IBOutlet UILabel *labelSceneTwo;
@property (weak, nonatomic) IBOutlet UILabel *labelTwoSceneTwo;

@property (weak, nonatomic) NSString *labelText;
@property (weak, nonatomic) NSString *labelTwoText;

@end

第二种ViewController.m(第一种方法)

(仅添加到 viewDidLoad)

- (void)viewDidLoad {
    [super viewDidLoad];

    _labelSceneTwo.text = _labelText;
    _labelTwoSceneTwo.text = _labelTwoText;

}

(我希望明天早上为第二种方法更新此 post)。

感谢您的宝贵时间。

更新 1:

对于方法 2,我目前得到一个 NSException 类型的未捕获异常。

在ViewController.m下prepareForSegue

UINavigationController *navController = (UINavigationController *)segue.destinationViewController;

secondViewController *svc = (secondViewController *)navController.topViewController;

NSMutableArray *textFieldMArray = [NSMutableArray arrayWithObjects:_textFieldData, _textFieldDataTwo, nil];

textFieldMArray = [[NSMutableArray alloc] init];

svc.labelTextMArray = textFieldMArray;

秒ViewController.h

已添加:

@property (strong,nonatomic) NSMutableArray *labelTextMArray;

秒ViewController.m

在视图中加载:

_labelTextMArray = [[NSMutableArray alloc] init];

//The line below is what is causing the termination, otherwise, screen shows 2 labels each saying "Label"
//If property of array is set to weak, then both labels appear blank.

_labelSceneTwo.text = [_labelTextMArray objectAtIndex:0];

_labelTwoSceneTwo.text = [_labelTextMArray objectAtIndex:1];

最终工作代码:
方法二:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {  
    UINavigationController *navController = (UINavigationController *)segue.destinationViewController;
    secondViewController *controller = (secondViewController *)navController.topViewController;

    NSMutableArray *textFieldMArray = [NSMutableArray arrayWithObjects:_textFieldData.text, _textFieldDataTwo.text, nil];
    controller.labelTextMArray = textFieldMArray;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    _labelSceneTwo.text = [_labelTextMArray objectAtIndex:0];
    _labelTwoSceneTwo.text = [_labelTextMArray objectAtIndex:1];
)

方法一:
几乎相同的代码,确保字符串也是 strong,例如删除 weak.

我们是如何到达那里的
首先,我建议稍微改变一下您的 prepareForSeque 方法。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    //include the code for the navigationController
    secondViewController *destinationController = (secondViewController *)segue.destinationViewController;
    destinationController.labelText = self.textFieldData.text;
    destinationController.labelTwoText = self.textFieldDataTwo.text;
}

您应该给 class 一个以大写字母开头的名称,例如 SecondViewController,这只是基本的编码约定。

关于选项 2:

NSMutableArray *textFieldMArray = [NSMutableArray arrayWithObjects:_textFieldData, _textFieldDataTwo, nil];
svc.labelTextMArray = textFieldMArray;

您应该删除 prepareForSegue 和 viewDidLoad 中的行 _labelTextMArray = [[NSMutableArray alloc] init];

而且我不确定 navController.topViewController 是否按照您期望的方式工作,我不知道 topViewController 是否已经更新。我建议按照我已经写下的方式购买新的 viewController。